高度なコンパイル言語用のバイトコードを作成しています。プロファイリングと最適化を少し行った後、現在使用しているswitch文が現在の最大パフォーマンスオーバーヘッドになっていることが明らかになりましたバイトコードの場合にジャンプします。ラベルのアドレス(MSVC)
私たちは、通常はオンになっている命令IDではなく、各ケースラベルのアドレスを取り出し、バイトコード自体のストリームに格納することを検討しました。これを行うと、ジャンプテーブルをスキップして、現在実行中の命令のコードの場所に直接ジャンプすることができます。これはGCCでうまく動作しますが、MSVCはこのような機能をサポートしていないようです。
インラインアセンブリを使用してラベルのアドレスを取得(および移動)しようとしましたが、動作しますが、インラインアセンブリを使用すると、MSVCオプティマイザによって関数全体が回避されます。
オプティマイザがコードに対して実行できるようにする方法はありますか?残念ながら、インラインアセンブリでも別の関数のラベルを参照する方法がないため、インラインアセンブリをラベルが作成された関数以外の別の関数に抽出することはできません。どのような考えやアイデアですか?あなたのご意見は大変ありがとうございます。
関数ポインタを試しましたか? –
バイトコードのラベルのアドレスではなく、関数のアドレスを入れてみましょうか?次に、各命令IDに対して1つの機能があります。 fetch-executeループが大規模なfunction-with-labelsに含まれていない限り –
私はそれぞれのケースで関数を使用し、ラベルアドレスの代わりに関数ポインタを使用するとうまくいくでしょう。しかし、関数呼び出しオーバーヘッドが非常に大きいので、たとえ関数が簡単であっても(引数なし、返りません)、パフォーマンスの向上は無効になるような気がします。私はそれを試してみるだろうと、投稿していただきありがとうございます。 – Trevor