Как лучше, последовательно или параллельно

Есть в .NET Framework 4.0 новое пространство имен System.Threading.Tasks, которое многие незаслуженно обходят своим вниманием. Там - уйма полезных классов, которые позволяют делать просто сложные вещи. Например класс Parallel. Простейшее применение - позволяет автоматически разбить кусок работы на части и выполнить в разных потоках, если это имеет смысл. Да-да! Класс сам определит количество ядер в системе и, например, количество итераций в цикле, который надо выполнить и выполнит его в оптимальном количестве потоков. Посмотрим насколько сложно его использовать:
using System;
using System.Threading.Tasks;
using System.Threading;

namespace ConsoleApplication2 {
class Program {
static void Main(string[] args) {
// sequential
DateTime start = DateTime.Now;
for (int i = 0; i < 10000; i++) {
EmulateSomeJob();
};
// parallel
DateTime start2 = DateTime.Now;
Parallel.For(0, 9999, i => {
EmulateSomeJob();
});
Console.WriteLine("Sequential Time Elapsed: {0}", (start2 - start).ToString());
Console.WriteLine("Parallel Time Elapsed: {0}", (DateTime.Now - start2).ToString());
Console.ReadLine();
}

static int y = 0;
static void EmulateSomeJob() {
int p = 0;
for (int x = 0; x < 1000000; x++)
p |= x;
Interlocked.Add(ref y, p);
}
}
}
Для того, чтобы запустить программу, сохраните ее в текстовый файл с именем Program.cs и скомпилируйте командой:
  csc Program.cs
Полученный в результате Program.exe после запуска выведет следующее:
Sequential Time Elapsed: 00:00:13.2623261
Parallel Time Elapsed: 00:00:07.3217321
Интересно понаблюдать за использованием процессора во время выполнения программы. У меня 2 ядра и ситуация была такой, сразу после запуска загрузка процессора достигла 50% (с небольшим), а через, примерно, 10 секунд - достигла 100%. Очевидно - начала выполняться параллельная часть программы. Замеры скорости приведены выше, а ведь обе части выполняют одинаковое количество работы.

Попробуйте кто-то в системе, где больше 2-х ядер.

Для тех, кто заинтересовался, подсказываю, что есть еще метод Parallel.ForEach

Коментарі

Unknown каже…
Как подсказал Алексей Гриневич, на i7-840QM (4 ядра + HT, всего 8 потоков выполнения) результаты такие:
Sequential Time Elapsed: 00:00:10.7785016
Parallel Time Elapsed: 00:00:03.5581935

Популярні дописи з цього блогу

Посчитать количество вхождений каждого слова в текстовом файле

Українська мова