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.