dispatch してみる

と、思ったんだけど、単にdispatchするだけならあまりに簡単だったので先にdispatchしてみた。

#include <stdio.h>
#include <Block.h>
#include <dispatch/dispatch.h>


int some_func(int a)
{
        int i;
        for (i = 0; i< 1000000; i++) {
                a *= a ;
                a %= 15721;
        }
        return a; // 抜けてた。恥ずかしい過ぎる。
}

#define N  1024
main() 
{
        int i;
        dispatch_queue_t dq;
        dq = dispatch_get_global_queue(0, 0);
        __block int result[N];

        dispatch_apply(N, dq, ^(size_t a) { result[a] = some_func(a); });

        for (i = 0; i< N; i++) {
                printf("%d, ", result[i]);
        }
        printf("\n");
}

some_funcに特に意味はありません。

em114-51-35-127% time ./dispatch >/dev/null
./dispatch > /dev/null  14.63s user 0.04s system 191% cpu 7.680 total
em114-51-35-127% time ./nondispatch >/dev/null
./nondispatch > /dev/null  14.58s user 0.04s system 99% cpu 14.677 total

191% とかすばらしい。将来のマシンではこれが6400 % とか行くんだろうか。見てみたいよ Larabbe。

しかし余談なんだけど gccで -O有効にすると何番でやっても some_func()が木偶にされてしまう。どうしたもんか。
追記:
ああ、本当に馬鹿すぎる。some_func()何も返して無いじゃん。家帰ってから気がついた。そりゃデクにもされるよはずかしい。
というわけで追加。アーんど-O5の結果。

em114-51-35-127% time ./dispatch >/dev/null
./dispatch > /dev/null  8.11s user 0.04s system 188% cpu 4.336 total
em114-51-35-127% time ./nondispatch >/dev/null
./nondispatch > /dev/null  8.11s user 0.04s system 97% cpu 8.362 total