2016-05-03 9 views
1

システムヒープと比較してカスタムヒープマネージャの作業をテストしている間に(システムを置き換えるために)私はいくつかの速度低下を経験しました。プロファイラはジャンプの時間が無く、比較に多くの時間を示します

Windows 7、Intel Xeon CPU E5-1620 v2 @ 3.70 GHzでプロファイリングx64アプリケーションにAMD CodeAnalystを使用しました。

Profile results

このブロックは、アプリケーション全体の実行のための時間の約90%を消費します:そして、次の結果を得ました。 "cmp [rsp+18h], rax""test eax, eax"に多くの時間を費やすことができますが、比較のすぐ下のジャンプに費やされる時間はありません。ジャンプに時間がかからないのは大丈夫ですか?それは分岐予測メカニズムのためですか?

私は(結果は私が手動でセッションをプロファイリング停止したため、絶対数では少し異なっている - しかし、まだ多くの時間がを比較によって取られる)私が持っているもの、ここでは逆に句を変更して: enter image description here

これらの比較の呼び出しがボトルネックになっている...これは私がこれらの結果を解釈する方法です。そしておそらく最適な最適化がアルゴリズムを改造しているのでしょうか?

+0

私はアルゴリズムを改善することができました。今度は、カスタムヒープは、リリース構成のシステム1と同じ速度です。しかし、質問は残っています、なぜ比較は時間がかかるのですがジャンプはありませんか? – greenpiece

+0

ヒープマネージャを作成しているので、テストするためにはヒープを大きく読み込む必要があります。あなたは明らかに内側のループを見ている。速くしたい場合は、全体の経過時間を使用してスピードアップを測定します。その割合は、スピードアップを探す場所を教えることです。 1つのコードでパーセント値を押し下げると、最大100%を加算する必要があるため、別のコードでパーセント値を上げます。確かに、それはキャッシュミスと分岐予測の問題かもしれません。それはあなたの時間を節約しようとしているCPUエンジニアです。しかし、あなたはこれを見ることができ、「私はこれを何回もすることができますか?それが時間を節約する方法です。 –

答えて

1

IntelおよびAMD CPU macro-fuse cmp/jcc pairs into a single compare-and-branch uop(Intel)またはmacro-op(AMD)。あなたのようなIntel SnBファミリのCPUは、and,sub/add,inc/decなどの出力レジスタを書き込むいくつかの命令でこれを行うことができます。

プロファイリングデータを実際に理解するには、調整中のマイクロプロセッサでアウトオブオーダーパイプラインがどのように機能するかを理解する必要があります。 タグwikiのリンク、特にAgner Fog's microarch pdfを参照してください。

プロファイリングサイクル数は、結果を待っている命令に課金されることがあります。命令を生成するのが遅い命令ではありません。