Benchmarking for() against foreach():

/////////
enum size_t maxarray = 500_000;

double[maxarray] a, b, c, d;

void main()
{
    import std.stdio;
    import std.datetime;

    import std.random;
    for (int n = 0; n < maxarray; n++)
    {
        a[n] = uniform01;
        b[n] = uniform01;
        c[n] = uniform01 + 0.1;
    }

    void overhead() {}

    void foreach_loop()
    {
        foreach(n, elem; d[])
            elem = a[n] * b[n] / c[n];
    }

    void for_loop()
    {
        for (int n = 0; n < maxarray; n++)
            d[n] = a[n] * b[n] / c[n];
    }

    auto r = benchmark!(overhead,
                        foreach_loop,
                        for_loop)(10_000);

    import std.conv : to;
    foreach (i, d; r)
        writeln("Function ", i, " took: ", d.to!Duration);
}
/////////


Depending on the machine this is run on, for() performs a factor 3-8 slower than foreach(). Can someone explain this to me? Or, taking for() as the norm, how can foreach() be so blazingly fast?
Thanks!

Reply via email to