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日悩んだ。