"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