blob: 18418ac2a43ceb6a17405532245c8da3d655a779 [file] [log] [blame]
@system unittest
{
import std.parallelism;
import std.algorithm.iteration : map;
import std.math.operations : isClose;
import std.parallelism : taskPool;
import std.range : iota;
// Parallel reduce can be combined with
// std.algorithm.iteration.map to interesting effect.
// The following example (thanks to Russel Winder)
// calculates pi by quadrature using
// std.algorithm.map and TaskPool.reduce.
// getTerm is evaluated in parallel as needed by
// TaskPool.reduce.
//
// Timings on an Intel i5-3450 quad core machine
// for n = 1_000_000_000:
//
// TaskPool.reduce: 1.067 s
// std.algorithm.reduce: 4.011 s
enum n = 1_000_000;
enum delta = 1.0 / n;
alias getTerm = (int i)
{
immutable x = ( i - 0.5 ) * delta;
return delta / ( 1.0 + x * x ) ;
};
immutable pi = 4.0 * taskPool.reduce!"a + b"(n.iota.map!getTerm);
assert(pi.isClose(3.14159, 1e-5));
}