0

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秒かかっていたため、これを偶然認識しただけです)非常にありそうもない)

4

1 に答える 1

0

それでも、私はそれがより速くそしてより良くなることができると思います-これは私がやっていると思ったことです

その後、それについて考えるのをやめます。

Luabindがその特定の方法でユーザーデータを使用するという保証はありません。userdataがクラスの正確なサイズであることは確かにわかりません。すべてのC++オブジェクトをある種のコンテナオブジェクトにラップすることができます。

つまり、 LuabindがC++オブジェクトをどのように表現しているかを正確に知る方法はありません。Luabindのソース(変更される可能性があります)を見ずにはいられません。

MyCClassおそらく、 Luabindでの継続的なマーシャリングが原因で、パフォーマンスの問題が発生しています。これを回避する最も簡単な方法は、マーシャリングを1回だけ実行することです。を使用してオブジェクトをLua内に保存しますluabind::object。インタプリタで作成して、そのままにしておいてください。次に、メソッドを呼び出すときにそのオブジェクトを使用します。Luabindは、関数を呼び出すたびにオブジェクトを再マーシャリングする必要はありません。

于 2012-07-10T03:42:55.237 に答える