bearophile wrote:
I have noticed a significant speed difference between foo1 and foo2 (D2 code):

import std.c.stdio: printf;

int foo1(int x, int y) {
    static int[int[2]] cache;
    int[2] args = [x, y];
    cache[args] = x;

Most of it comes from the use of that temporary. -O doesn't help either.

This makes foo1 only slightly slower than foo2:

//     int[2] args = [x, y];
    cache[[x, y]] = x;

    return x;
}

int foo2(int x, int y) {
    static struct Pair { int x, y; }
    static int[Pair] cache;
    Pair args = Pair(x, y);
    cache[args] = x;
    return x;
}

void main() {
    enum int N = 600;
    int tot;
    foreach (x; 1 .. N)
        foreach (y; 1 .. N)
            tot += foo2(x, y); // use foo1 or foo2 here
    printf("%d\n", tot);
}


Bye,
bearophile

Ali

Reply via email to