bearophile , dans le message (digitalmars.D.learn:35148), a écrit :
Why don't you write a little benchmark to compare the performance
of the two versions?
Because I'm interested in the code's meaning for the human reader, not
the performance.
I actually think : map!(_= uniform(a, b))(repeat(0)) is better,
because it puts the call to uniform first, and the _ indicates that the
rest is unimportant.
For you curiosity, this is the benchmark using:
gdc (GCC) 4.7.0 20120322 (gdc 0.31 - r805:0414cec152c7, using dmd 2.057)
and
gdc -O3 testRNG.d ./a.out
import std.array, std.range, std.algorithm, std.random, std.stdio,
std.datetime;
auto uniformRange1(T1, T2, T3)(T1 a, T2 b, T3 gen)
{
return map!((x) {return x();} ) (repeat((){return uniform(a, b, gen);}));
}
auto uniformRange2(T1, T2, T3)(T1 a, T2 b, T3 gen)
{
return map!((x) { return uniform(a, b, gen); })(repeat(0));
}
auto uniformRange3(T1, T2, T3)(T1 a, T2 b, T3 gen)
{
return map!((x) { return uniform(a, b, gen); })(cycle([0]));
}
void f1() { auto ur = array(take(uniformRange1(0, 10, Xorshift(1)),
1000)); }
void f2() { auto ur = array(take(uniformRange2(0, 10, Xorshift(1)),
1000)); }
void f3() { auto ur = array(take(uniformRange3(0, 10, Xorshift(1)),
1000)); }
void main() {
auto b=benchmark!(f1, f2, f3)(1000);
writeln(b[0].to!(seconds,double),s, , b[1].to!(seconds,double),
s, , b[2].to!(seconds,double),s. );
// outputs :
// 0.040437s, 0.0393537s, 0.0486439s
}
f2 performs 23% better than f3, and 3% better than f1.
--
Christophe