squirrelとc++の速度比較

#pragma optimize("",off)
static void dummyfunc(){}//最適化抑制のための関数
#pragma optimize("",on)

struct Foo {
    int num;
    Foo() { num = 0; }
    void inc() { ++num; dummyfunc(); }
};

Foo foo;
for(int Li=0;Li<1000*1000;++Li){
    foo.inc();
}

O2でビルドしてforループんとこの時間を計測すると、2620μ秒

//fooをsquirrelへ登録
vm.creg("foo",&foo)
    .function("inc",&Foo::inc);
//スクリプトコードをコンパイルして実行
SQCODE(vm,
    suspend();//スクリプト起動直後にいったん停止
    for(local Li=0;Li<1000*1000;++Li){
        foo.inc();
    }
    );
//処理を再開して実行
vm.wakeup();

このwakeupでスクリプト内のforを実行しているのでその時間を計測すると259940μ秒

SQCODE(vm,
    local bar = class {
        num = 0;
        function inc() {
            ++num;
        }
    }();
    suspend();//いったん停止
    for(local Li=0;Li<1000*1000;++Li){
        bar.inc();
    }
    );
vm.wakeup();

ちなみにスクリプトで全部やると、869160μ秒

わかってたけどやっぱりかなり重いすな。。。

バグ

callから処理が返ってきたときにthreadがsuspendしてたらstackからclosureを抜いちゃダメだったらしい。3日悩んだ。