parallelism

paralleliszm

В этой главе: totalCPUs, parallel, currTime, Duration, uniform, Thread.sleep, dur!

Код

import std.stdio, std.parallelism, std.random, core.thread;

void main()
{
  writefln( "CPUs: %s", totalCPUs ); // количество доступных процессоров
  MonoTime before = MonoTime.currTime; // текущее время
  auto nn = [1,2,3,4];
//  foreach(n; nn){ // последовательный цикл
  foreach(n; parallel( nn)){ // параллельный
    mysub(n);
  }
  MonoTime after = MonoTime.currTime;
  Duration timeElapsed = after - before; // разница типа Duration
  writefln("Duration: %s", timeElapsed);
}

auto mysub(int n){
 uint i = uniform(1,6); // нормально случайное от 1 до 5
 Thread.sleep( dur!("seconds")(i) ); // dur! создает тип Duration
 writefln("%d slap %d", n, i);
}

Программа печатает

CPUs: 2
N 1 slap 4 sec
N 2 slap 4 sec
N 4 slap 4 sec
N 3 slap 5 sec
Duration: 9 secs, 288 μs, and 5 hnsecs

Что делает

Функция mysub получает текущий элемент массива. Получает случайное целое число и спит это количество секунд. Основная программа, создает массив [1,2,3,4] и обходит его в цикле, вызывая на каждой итерации mysub. Она замеряет общее количество секунд, которое потребовалось для обхода всего массива. Функция parallel создает параллельную версию цикла. Как видно, параллельная версия тратит меньше времени, чем сумма секунд всех итераций. Отличительной чертой D от других языков является, то, что вместо нескольких параллельных версий функций, вроде pmap, pgrep и.т.д. используется параллельный цикл parallel.

results for ""

    No results matching ""