Luaを静的にリンクされたlibとして実行する場合とスタンドアロンのインタープリターとして実行する場合の大幅な速度低下


7

私はLuaでいくつかのアルゴリズムを開発しています。これらは主にLuaで実行され(C ++への呼び出しはほとんどありません)、デフォルトのLuaインタープリターではなくアプリから実行すると、大幅な速度低下に気づきます。スクリプトはインタプリタで約11秒、プログラムで約5 分以上で戻ります。

C ++関数の呼び出しに問題があるとは思わない。スクリプト内の空の関数でその関数を無効にしても、時間に対する顕著な影響はない。

Luaとプログラムの両方がVisual Studio 2010でコンパイルされている(私はLuaの新しいソリューションを作成し、インタープリターと静的ライブラリの両方のプロジェクトを作成しました)

私はコードでプロファイラーを実行しました(Very SleepyプロファイラーはLuaプロファイラーを動作させることはできませんが、あまり試みていません)。私のアプリケーションでは、時間の約50%がmallocに費やされています。両方ともLuaガベージコレクターから呼び出され、40%が無料です(これをチェックして無効にしようとしましたが、大量のメモリを使用すると(当然)、Luaインタープリターが約4MBのRAM使用率でピークします)。

私はLuaの初心者なので、どこかで何か間違ったことをした可能性があります。誰かがいくつかのヒントを試してみましたか?


malloc!諸悪の根源!Luaを最初に調査したときに同様の問題に遭遇し、その努力を放棄したので、解決策があるかどうか知りたいです。
Crashworks

luaのデフォルトのメモリハンドラをreallocを使用するものに変更する提案はありませんでした。しかし、それは約3年前のことです。Luaをどのようにバインドしますか?Luabindを使用する場合は、メソッドを直接バインドする場合、またはおそらくtoLuaと比較する場合と比べて、関数呼び出しのオーバーヘッドがかなり大きくなります。
LearnCocos2D 2010年

LuaのGCを最適化するための推奨事項を試しましたか?lua-users.org/wiki/OptimisingGarbageCollection
David Young

@DavidYoung私はそれを少し最適化しようとしましたが、両方で約15%速くなりました。速度の大きな違いを実際に説明するものは何もありません
Elva

@GamingHorrorがコールスタックを振り返ると、mallocがreallocから呼び出されているように見えます(luaV_execute-> luaM_realloc _-> l_alloc-> realloc-> malloc)。また、Lua C apiを直接使用し、少しのユーザーデータを使用しています呼び出す必要がある1つのクラス。
Elva

回答:


4

あなたが言うように、Luaはデフォルトでcrazyのようなメモリ割り当てを行います。Luaプログラムで通常使用される割り当てパターンをよく理解しているカスタムアロケーター作成するか、tcmallocなどのプラグインを使用して、割り当てパフォーマンスを全体的に向上させることを検討してください。


私はそれを試しました、それは少しの時間を節約します(数秒、スタンドアロンのインタプリタの近くにはまだありません)、おそらく問題(またはそれらの1つ)は、割り当て時間が一定ではなく、メモリの量に依存することです以前に予約されましたか?それはLuaだけのメモリプールを使用することで解決できます。私はそれを試してみます(誰かがそれを実装するためのヒントを持っていますか?)。
Elva

tcmallocで数秒節約できるものは何ですか?mallocが一般的に遅い理由は、割り当て時間が一定ではないためです(多くの場合、一定ではありません)。これは、割り当てに恐ろしいキャッシュの局所性、大量のロックオーバーヘッド、デバッグビルドでの一貫性チェックのトンなどがあるためです。基本的には、スクリプトの実行中に実際のmallocを呼び出すことは絶対にありません(特に実際にはフリーではありません!)。常に、可能な限り既存のメモリプールを使用してください。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.