これは既存のスレッド (http://stackoverflow.com/questions/12724887/caching-in-a-high-performance-financial-application) のフォローアップです。アプリケーションを妨げているのはキャッシュではないことがわかりました。簡単に言うと、実行時間の 70% を 1 つの関数 (22 秒のうち 15 秒) に費やすアプリケーションがあります。したがって、この関数の想定される使用ははるかに大きなデータ用であるため、この関数の実行時間を可能な限り短縮したいと思います (つまり、22 秒は計画された実行時間ではありません:)
問題は、VTune の出力が私を困惑させていることです。コードは、まったく予想外の場所で膨大な時間を費やしているようです。アイデアが尽きてしまったので、私のプロジェクトをプロファイラーの結果と合わせてここに投稿します。
問題のある evaluateExits() 関数を見ると、次のことが私を困惑させます。
1/ 関数は、パラメーターに関係なく 1 を返すインライン関数の呼び出しにたまたま 2.2 秒を費やしています (425 行目、this->contractManager->contractCount())。注: パラメータに関係なく関数が 1 を返すバージョンは、考えられるケースの 1 つであるため、「contractCount=1」を入れてそのままにしておくことはできません。仮想テーブル ポインタからのリダイレクトで 2.2 秒 (contractCount() は仮想メソッド) を消費できますか?
2/ 関数は、可能な限り CPU に優しいバージョンの wmin を使用しているにもかかわらず、min(uint1, uint2) (432 行目) に 3.3 秒を費やします。
3/ 関数は 512 行目に 1.6 秒を費やしますが、これは非常に些細な操作であり、呼び出される関数は仮想関数ではありません。
質問は、これらの 3 行のコードになぜそんなに時間がかかるのかということです。私は何を見落としていますか?また、コードを最適化して実行速度を上げるにはどうすればよいでしょうか? wmin() を、配列全体に適用される min の SSE バージョンに置き換える必要がありますか?
どんな入力でも大歓迎です。ダニエル
編集: アセンブリを調べたところ、1/ の場合、コードを「遅く」するのは vfptr であることがわかりました。仮想関数の呼び出しを Don Clugston の fastdelegate に置き換えましたが、パフォーマンスの変化はまったく発生しませんでした (理由はわかりません)。ナイチンゲールのコメントにより、添付ファイルには必要なすべてのファイルが含まれているはずです。ただし、バイナリは数百 MB のデータがある共有メモリに接続するため、正常に実行できません。