0

環境:

現在、まだ gcc-4.1.2 を使用している私のチームの現在のビルド環境と、gcc-4.8.1 を使用したビルドとの間のパフォーマンスの向上を調査しています。結果は驚くべきもので、回帰全体で少なくとも 25% のスピードアップの加重平均が得られました。また、gcc-4.4.7 を使用して別のテストを行いましたが、加重平均で約 7% の速度向上しか見られませんでした。この大きな不一致は、新しい C++11 のコピー/移動セマンティクスに関連していると推測していました。これは、メモリ トランザクションがプログラムのかなり大きなボトルネックだったためです。私たちは STL 型を多用しているので、おそらくコンパイラは新しいムーブ コンストラクタをうまく利用していたのでしょう。

私の主張を検証するために、平均的なパフォーマンスの向上を示すテストを選び、両方のコンパイルで kcachegrind を実行しました。結果は以下に掲載されていますが、期待したほどではありませんでした。迅速で潜在的に関連する詳細を指摘する必要があります。官僚的な理由から、gcc-4.8.1 の libstdc++.so を静的にコンパイルする必要がありました。これは、kcachegrind の場所が、私が安全のために検閲したいくつかのプライベート ライブラリを示していたことを意味します。

ここに画像の説明を入力

驚いたことに、メモリ操作の呼び出しの量は比較的変化がありませんでした (mallocおよび_int_malloc)。もう 1 つの興味深い結果は、 がまったくなく、memcpyが追加されていることです_memcmp_sse4_1

質問:

C++11 セマンティクスがパフォーマンス向上の理由であるという私の仮説を検証したい場合、callgrind グラフで何を探す必要がありますか? より少ないメモリアクセスを見つける必要がありますか、それともstd::string(string&&)署名を見つける必要がありますか (実際にはここにはありません)。これは でコンパイルされていることに注意してください。これは-O3、そのような署名が最適化されていないことを意味する可能性があるため、私のジレンマです。

このような大幅なパフォーマンスの向上を報告できることを嬉しく思いますが、このパフォーマンスがどこから来ているのかを理解したいと思います. より明確な回答を得るために、さらに結果を報告する必要がある場合はお知らせください。これがSOにとって一般的すぎる質問ではないことを願っています...

4

0 に答える 0