質問

私たちは g++ バージョン 3.2.3 と 4.2.4 を検討してきました。4.2.4 では、コードベースの一部でパフォーマンスが大幅に向上しました。

検索してみましたが、 gcc buzilla データベース どのバグがこれほど劇的な改善をもたらしたのかヒントを見つけようとしましたが、候補となるような目立った個別のバグは見つかりませんでした。

この改善は、ゆっくりと影響を及ぼした多くの小さな変更の結果ですか?それとも、変化をもたらした可能性のある上位 5 つの改善点があったのでしょうか?

背景として、私たちのコード ベースは STL コンテナーとアルゴリズムに加えて、「inline」キーワードなどの C++ 機能をうまく利用しています。

役に立ちましたか?

解決

私の経験では、基本的にパフォーマンスがピークに達したのは 3.4 です。実際、私のプロジェクトでは 4.2 は 3.4 よりも遅く、4.3 は初めて 3.4 のパフォーマンスとほぼ同等になりました。4.4 は 3.4 よりわずかに高速です。

古いバージョンの gcc がコード内で信じられないほど遅いことを行っていた特定のケースがいくつかありました。3.4 から 4.3 では 128 クロックから 21 クロックに上昇した特定の関数がありましたが、これは明らかに特殊なケースでした (これは短いループであり、ほんの数個の不必要な命令を追加するだけでパフォーマンスが大幅に低下しました)。

私が個人的に 3.4 を使用しているのは、コンパイルが非常に速く、テストがより迅速に行えるからです。また、私は最新バージョンを避けるようにしています。なぜなら、最新バージョンにはコードをコンパイルミスするという厄介な習慣があるようです。たとえば、最近の gcc バージョンの --march core2 は、整列されていないアドレスに対して整列されたアクセスを実行しようとする自動ベクトル化されたコードを生成するため、プログラムでセグメンテーション違反を引き起こします。

全体としては、違いが大きくなることはほとんどありません。3~5%が絶対値 ほとんど パフォーマンスの変化を見てきました。

さて、これは C であることに注意してください。C++ では事情が異なる場合があります。

他のヒント

gcc4 シリーズではオプティマイザが完全に作り直されたと思います。たとえば、ベクトル化については、次のページを参照してください。

http://gcc.gnu.org/projects/tree-ssa/vectorization.html

参考までに、私はかつて動的配列、静的配列、std::vector を使用して c[i] = a[i] + b[i] のベンチマークを実行しましたが、最も高速だったのは std::vector でした (gcc を使用) 4.1)。性能に30%の差。

ストリームは 3.3 では非常に遅かったですが、3.4 でははるかに速くなりました。(GCC メーリング リストのメッセージ)私も他のことが改善したに違いない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top