この問題 (および一般的な LJ) は私にとって大きな苦痛の源であったため、将来誰かを助けることができることを期待して、いくつかの追加情報をリングに投げ込みたいと思います.
「コールバック」は常に遅いとは限らない
LuaJIT FFI のドキュメントでは、「コールバックが遅い」と記載されている場合、LuaJIT によって作成され、FFI を介して C 関数に渡されたコールバックのケースについて非常に具体的に言及しています。これは、他のコールバック メカニズムとはまったく異なります。特に、API を使用してコールバックを呼び出す標準の lua_CFunction を呼び出す場合と比べて、パフォーマンス特性がまったく異なります。
そうは言っても、本当の問題は次のとおりです。Lua C API を使用して、pcall などを含むロジックを実装するのではなく、すべてを Lua に保持するのはいつですか? パフォーマンスに関してはいつものことですが、特にトレース JIT の場合は、答えを知るために (-jp) をプロファイリングする必要があります。限目。
私は、似ているように見えても、パフォーマンス スペクトルの両端に位置する状況を見てきました。つまり、Lua 専用として構造化した方がパフォーマンスが向上するコード (おもちゃのコードではなく、高パフォーマンスのゲーム エンジンを作成するコンテキストでの製品コード) と、構造的に類似しているように見えるコードに遭遇しました。 luaL_ref を使用してコールバックとコールバック引数へのハンドルを維持する lua_CFunction を呼び出して言語境界を導入すると、パフォーマンスが向上します。
測定せずに LuaJIT を最適化するのはばかげたことです
静的言語のパフォーマンス分析の専門家であっても、JIT のトレースを理解するのはすでに困難です。彼らは、あなたがパフォーマンスについて知っていると思っていたすべてを取り上げ、それを粉々に砕きます。関数をコンパイルするのではなく、記録された IR をコンパイルするという概念が、LuaJIT のパフォーマンスについて推論する能力をまだ消滅させていない場合、FFI を介して C を呼び出すことは、JIT が成功した場合、多かれ少なかれ自由であるという事実ですが、潜在的に注文 -解釈されると、同等の lua_CFunction 呼び出しよりもはるかに高価です...まあ、これは確かに状況を限界に押し上げます。
具体的には、あなたが先週書いた C の同等のシステムよりもはるかにパフォーマンスが優れていたシステムが、今週は機能しなくなる可能性があります。なぜなら、そのシステムのトレースに近い場所に NYI を導入したからです。システムが後退し、パフォーマンスが低下しています。さらに悪いことに、あなたは NYI とそうでないものをよく知っているかもしれませんが、JIT の最大記録 IR 命令、最大仮想レジスタ、呼び出し深度、アンロール係数を超えるコードをトレース近接に追加しました。サイドトレースリミット...など
また、「空の」ベンチマークは非常に一般的な洞察を与えることもありますが、LJ では (前述の理由から) コードをコンテキストでプロファイリングすることがさらに重要であることに注意してください。トレースはその性質上非ローカルであるため、LuaJIT の代表的なパフォーマンス ベンチマークを作成することは非常に困難です。大規模なアプリケーションで LJ を使用すると、これらの非ローカルな相互作用が非常に影響力を持つようになります。
TL;DR
LuaJIT の動作を真に理解している人は、この地球上に 1 人しかいません。彼の名前はマイク・ポールです。
あなたが Mike Pall でない場合は、LJ の動作とパフォーマンスについて何も想定しないでください。-jv (冗長; NYI とフォールバックに注意)、-jp (プロファイラー! カスタム アノテーション用にjit.zoneと組み合わせます。-jp=vf を使用して、フォールバックのためにインタープリターで費やされている時間の割合を確認します) 、そして、何が起こっているのかを本当に知る必要がある場合は、-jdump(トレース IR & ASM)。測る、測る、測る。LJ のパフォーマンス特性に関する一般化は、その人自身によるものか、特定の使用例で測定したものでない限り、大まかに考えてください (その場合、結局のところ、それは一般化ではありません)。覚えておいてください、正しい解決策はすべて Lua であるかもしれませんし、すべて C であるかもしれません。Lua -> FFI を介した C であるかもしれません。Lua -> lua_CFunction -> Lua であるかもしれません。
何度も何度もだまされて LuaJIT を理解していると思い込み、翌週に間違っていることが証明された人からの情報ですが、この情報が誰かの役に立てば幸いです :) LuaJITについての知識に基づいた推測。私のエンジンは実行ごとに jv と jp のログを出力します。これらは最適化に関して私にとって「神の言葉」です。