C++ オブジェクトの 1 つを lua 関数の引数として導入すると、パフォーマンスが大幅に低下することに気付きました。
function luaFunc(someString)
print someString
end
これは非常に高速です。10 万回の呼び出しで 30 ミリ秒未満です。
今、私は別のオブジェクトを追加しました
function luaFunc(myCObj, someString)
print somestring
myCObj:doStuff()
end
100k の呼び出しに 1 秒以上かかるようになりました。(int や string などの別のプリミティブを arg として追加しても、パフォーマンスに影響はありません! また、オブジェクトをグローバル スコープに入れます (たとえば、毎回 func arg としてプッシュしないでください。パフォーマンスにも影響はありませんが、引数として必要です)。
これは、luabindを使用して呼び出す方法です
luabind::call_function<void>(fn,myCObj,message);
この「ハック」を使用して、luas pcall関数を直接使用するだけで、時間を0.5秒短縮できました。
// this will automatically set the correct class metatable for me
luabind::globals(fn.interpreter())["myCObj"] = myCObj;
// push my userdata obj onto the stack including the class metatable
lua_getglobal(fn.interpreter(), "myCObj");
lua_pushstring(fn.interpreter(),message);
lua_pcall(fn.interpreter(), 2, 0,0));
それでも、私はそれがより速く、より良いものになると思います-これは私がやっていることだと思いました
void *pUserData = lua_newuserdata( fn.interpreter(), sizeof( MyCClass ) );
pUserData = myCObj;
lua_getmetatable(fn.interpreter(),????);
lua_setmetatable( fn.interpreter(), -2 );
lua_pushstring(fn.interpreter(),message);
lua_pcall(fn.interpreter(), 2, 0,0));
したがって、luabindは各クラスのいくつかのメタテーブルを管理していると思います-しかし、それを取得する方法がわかりません-ソースで「__luabind_classrep」について何かを見ました-さらに-グローバルには、クラスを登録した名前のユーザーデータobjがありますルバインド。
編集:私は実際に最初のスローダウンの問題を追跡しました-それはluabindでも私のコードでもありませんでした-VS2010 F5でベンチマークを行っていましたが、自動的にデバッガーをアタッチしました-何らかの理由で、MyCObjを引数としてlua関数に追加すると-デバッガーは処理全体を遅くしました-シェルから手動でコマンドラインプログラムを実行しましたが、再び許容範囲内でした(同じVSプロジェクトのより高速なコンピューターが1秒ではなく4秒かかっていたため、これを偶然認識しただけです)非常にありそうもない)