Читаем C# 4.0: полное руководство полностью

    if(data[i] > 20000 & data[i] < 30000) data[i] = 200;

    if(data[i] > 30000) data[i] = 300;

  }

  static void Main() {

    Console.WriteLine("Основной поток запущен.");

    data = new int[100000000];

    // Инициализировать данные в обычном цикле for.

    for (int i=0; i < data.Length; i++) data[i] = i;

    // Распараллелить цикл методом For().

    Parallel.For(0, data.Length, MyTransform);

    Console.WriteLine("Основной поток завершен.");

  }

}

Эта программа состоит из двух циклов. В первом, стандартном, цикле for инициализируется массив data. А во втором цикле, выполняемом параллельно методом For(), над каждым элементом массива data производится преобразование. Как упоминалось выше, это преобразование носит произвольный характер и выбрано лишь для целей демонстрации. Метод For() автоматически разбивает вызовы метода MyTransform() на части для параллельной обработки отдельных порций данных, хранящихся в массиве. Следовательно, если запустить данную программу на компьютере с двумя доступными процессорами или больше, то цикл преобразования данных в массиве может быть выполнен методом For() параллельно.

Следует, однако, иметь в виду, что далеко не все циклы могут выполняться эффективно, когда они распараллеливаются. Как правило, мелкие циклы, а также циклы, состоящие из очень простых операций, выполняются быстрее последовательным способом, чем параллельным. Именно поэтому цикл for инициализации массива данных не распараллеливается методом For() в рассматриваемой здесь программе. Распараллеливание мелких и очень простых циклов может оказаться неэффективным потому, что время, требующееся для организации параллельных задач, а также время, расходуемое на переключение контекста, превышает время, экономящееся благодаря параллелизму. В подтверждение этого факта в приведеннрм ниже примере программы создаются последовательный и параллельный варианты цикла for, а для сравнения на экран выводится время выполнения каждого из них.

// Продемонстрировать отличия во времени последовательного

//и параллельного выполнения цикла for.

using System;

using System.Threading.Tasks;

using System.Diagnostics;

class DemoParallelFor {

  static int[] data;

  // Метод, служащий в качестве тела параллельно выполняемого цикла.

  // Операторы этого цикла просто расходуют время ЦП для целей демонстрации,

  static void MyTransform(int i) {

    data[i] = data[i] / 10;

    if(data[i] < 1000) data[i] = 0;

    if(data[i] > 1000 & data[i] < 2000) data[i] = 100;

    if(data[i] > 2000 & data[i] < 3000) data[i] = 200;

    if(data[i] > 3000) data[i] = 300;

  }

  static void Main() {

    Console.WriteLine("Основной поток запущен.");

    // Create экземпляр объекта типа Stopwatch

    // для хранения времени выполнения цикла.

    Stopwatch sw = new Stopwatch();

    data = new int[100000000];

    // Инициализировать данные,

    sw.Start();

    // Параллельный вариант инициализации массива в цикле.

    Parallel.For(0, data.Length, (i) => data[i] = i );

    sw.Stop();

    Console.WriteLine("Параллельно выполняемый цикл инициализации: " +

          "{0} секунд", sw.Elapsed.TotalSeconds);

    sw.Reset();

    sw.Start();

    // Последовательный вариант инициализации массива в цикле,

    for(int i=0; i < data.Length; i++) data[i] = i;

    sw.Stop();

    Console.WriteLine("Последовательно выполняемый цикл инициализации: " +

          "{0} секунд", sw.Elapsed.TotalSeconds);

    Console.WriteLine();

    // Выполнить преобразования,

    sw.Start();

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных