function vs delegate

http://pc5.2ch.net/test/read.cgi/tech/1091185216/778-

quicksort でこの差が出るのなら function と delegate は結構パフォーマンスが違うんじゃないかと思った。実際使う際は気にならない、という意味で quicksort だったのかもしれないけど、単体で見ないとわからんこともあるはず。この quicksort データの準備に半分の時間使ってるし。

> ./dele_fun
613    # function
2088   # delegate method
986    # delegate inner function

まぁこんなとこか。アセンブラ読む必要もなさげ。ちなみに function と関数ポインタは等速。最適化は -O を使用。 -O が無いと inner function の delegate が function と等しくなった。

GDC はやはり delegate の扱いがヘンだ。

> ./a.out
988
2262
54496

こっちはアセンブラ読むなりなんなりした方が良さげ。以下ソース。

private import std.date;

int i;
int func() { return i+2; }

class C {
    int i;

    int func() { return i+2; };

    void run1() {
        int function() fp = &.func;
        d_time start = getUTCtime();
        for (int i = 0; i < 10000; i++) {
            for (int j = 0; j < 10000; j++) {
                assert(2 == fp());
            }
        }
        printf("%d\n", cast(int)(getUTCtime()-start));
    }

    void run2() {
        int delegate() de = &func;
        d_time start = getUTCtime();
        for (int i = 0; i < 10000; i++) {
            for (int j = 0; j < 10000; j++) {
                assert(2 == de());
            }
        }
        printf("%d\n", cast(int)(getUTCtime()-start));
    }

    void run3() {
        int i = 1;
        int delegate() de = delegate int() { return i+2; };
        d_time start = getUTCtime();
        for (int i = 0; i < 10000; i++) {
            for (int j = 0; j < 10000; j++) {
                assert(3 == de());
            }
        }
        printf("%d\n", cast(int)(getUTCtime()-start));
    }
}

int main() {
    C c = new C();
    c.run1();
    c.run2();
    c.run3();
    return 0;
}
なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h