Loops versus ranges

anon via Digitalmars-d-learn digitalmars-d-learn at puremagic.com
Fri Dec 19 03:29:51 PST 2014


On Friday, 19 December 2014 at 10:41:04 UTC, bearophile wrote:
> A case where the usage of ranges (UFCS chains) leads to very 
> bad performance:
>
>
> import std.stdio: writeln;
> import std.algorithm: map, join;
>
> uint count1, count2;
>
> const(int)[] foo1(in int[] data, in int i, in int max) {
>     count1++;
>
>     if (i < max) {
>         typeof(return) result;
>         foreach (immutable n; data)
>             result ~= foo1(data, i + 1, max);
>         return result;
>     } else {
>         return data;
>     }
> }
>
> const(int)[] foo2(in int[] data, in int i, in int max) {
>     count2++;
>
>     if (i < max) {
>         return data.map!(n => foo2(data, i + 1, max)).join;
>     } else {
>         return data;
>     }
> }
>
> void main() {
>     const r1 = foo1([1, 2, 3, 4, 5], 1, 7);
>     writeln(count1); // 19531
>     const r2 = foo2([1, 2, 3, 4, 5], 1, 7);
>     writeln(count2); // 1111111
>     assert(r1 == r2); // Results are equally correct.
> }
>
>
> Can you tell why? :-)
>
> Bye,
> bearophile

Changed to
     return data.map!(n => foo2(data, i + 1, 
max)).cache.joiner.array;
then it produced the same result as array version. 
`map.cache.join` resulted in 597871.


More information about the Digitalmars-d-learn mailing list