バックグラウンド
ランダム分岐にはかなりのオーバーヘッドがかかることが知られています。 そして、そのような質問に答えるSOの投稿がありました。
多くのCPUアーキテクチャのジャンプ命令でも、同様のパフォーマンスへの影響が見られます。そして、そのようなテーマについてもSOに投稿がありました
したがって、関数ポインタや通常の継承可能なC ++クラスベースの関数呼び出しなどのプログラミングパターンを使用した場合、ブランチミスのコストを支払う必要があります。
最先端のハードウェア分岐予測アルゴリズムでも、グローバルに共有されるアドレス履歴ベースの分岐予測しか実行できず、おそらく分岐ターゲットアドレスコードなどを投機的にフェッチする可能性があります。
しかし、定義上、最初の実行では機能しません。
多くの組み込みアプライアンス、スマートフォンなどは、最大のパフォーマンスを要求する必要があります
- 起動時間
- ブラウザのようなアプリケーションの最初の実行
これは何百万もの関数呼び出しを呼び出し、すべての間接ジャンプを直接ジャンプに変換するようなソフトウェアアーキテクチャを大幅に変更したくない場合があります...
条件が以下の場合、
条件:
- 最高速度で実行する必要があります
- 最初の実行時
または - ジャンプはCPUに対して完全にランダムに見えます
- 最初の実行時
結果を達成するために次のことが最善ですか?
そして、間接ジャンプから直接ジャンプへの動的/静的コードの書き換えを行う例を知りたいです。
最大のパフォーマンスを得る方法:
- 常に可能性が高いまたは可能性が低いブランチを使用する
- プレリンクを使用
- mlockまたはreadaheadを使用し、関数呼び出しをcacheflush(ICACHE)します
- 間接ジャンプを動的または静的に直接ジャンプに書き直します
(1996年にBradley M Kuhnによって書かれた論文で、場合によっては静的書き直しがあります)
私が見つけた論文は、仮想関数呼び出しをソースコードレベルで静的関数呼び出しに変換することでしたが、ソフトウェア開発者の観点からは、バイナリリンク時間の最適化の方が優れているように見えました。