2015-12-13 21 views
7

私は13年にわたり様々な言語でソフトウェアエンジニアを経験してきましたが、私は今やCとそれ以降のC++に移行しています。私はC言語を学んでいるので、GCCコンパイラを使って自分のプログラムをコンパイルしています。-O3や他の最適化フラグを使うのに不具合があるのでしょうか?コンパイルされたコードをテストせずに私のソフトウェアが壊れたり、クロスコンパイル中に私のソフトウェアが壊れる可能性はありますか?私は誤って別のプラットフォームで何かを混乱させるかもしれません。GCCで-O3を使用することに欠点はありますか?

私が盲目的にこれらのオプションをオンにする前に、私は何が期待できるのか知りたいと思います。また、-Ofastは非標準準拠のフラグをオンにするので、私はそれを使わない方に傾いています。 -Ofastが "副作用"を持つ可能性が高いという私の仮定を訂正していますか?

私はこの質問を投稿する前にhttps://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.htmlを見てきました。

+0

-O2の場合は、-O3よりも多くのマイレージがあると思います。バイナリをテストすることをお勧めします... –

+2

とにかくすべてのバイナリをテストする必要があります。 –

+0

@dwelchそうです。私はテストについて書いた後、コンパイルする前にテストすることができないことに気付きました。私はパブリックインターフェイスを回避できる言語テストのスクリプトに慣れていると思います。 –

答えて

7

の唯一の欠点は、デバッガでコードをたどることができないことであるべきです。

-Ofastの使用は、浮動小数点演算の一部に影響を与え、丸め誤差を引き起こす可能性がありますが、浮動小数点演算の長連鎖を特に実行している場合を除き、

多くのプログラマーの最初の反応は、コンパイラを責めることです。すべての警告を有効にし、それらを修正すると、通常は役立ちます。

+0

警告とエラーはデフォルトで有効になっていませんか?それは吸う。私は 'ウォール'と 'エール'を使っているのですか?私はちょうど[文字通りすべてのGCCの警告をオンにする方法を見つけましたか?](http://stackoverflow.com/questions/11714827/how-to-turn-on-literally-all-of-gccs-warnings)。 –

+1

'-Wall'はすべての警告を有効にするのではなく、もっとも有用なサブセットのみを有効にします - [ここで確認できます]という警告があります(https://gcc.gnu.org/onlinedocs/gcc/ Warning-Options.html) – Soren

+3

@RickMacGillis '-Wall -Wextra -pedantic'は便利で、言語標準(' -std = c11'または '-std = C++ 14')を手動で指定することも忘れないでください。 GNUモードを提供します(有用ではありますが、非標準的な)拡張機能を提供します。 – Leushenko

1

-O3がコードを最適化するように移動するので、場合によっては結果が異なるか、ブレークが発生することがあります。

あなたは-O3と正しさのためにあなたのコードをテストし、そのデバッグできない問題を見つけた場合、あなたが同じ動作を取得かどうかを確認するために-O0に切り替えることをお勧めします。

-O3
+2

準拠しているコードは、標準で要求されているものとは異なる動作をしてはならない。そして、デバッグのための最適化を変更しても、それ以上のことはできません。 (これは、最適化されたコードをデバッグする問題とは関係がありません;一般に、gccを仮定してデバッグするときはe'- = g'とする必要があります)。 – Olaf

+0

真ではありますが、すべてのコードが標準で書かれているわけではありません。私は膨大な数の行を持つ科学的コードでこの動作を特別に見てきました。 – Ashkan

+0

だからこそ私は "Compliant code ..."から始めました。この問題は、コードレビューなしでは答えられません。 – Olaf

4

それはほとんどすべてのコンパイラの最適化がヒューリスティックあることを覚えておくことが重要です。言い換えると、 "optmization"はの試行になっているだけで、プログラムをより「最適」にすることができますが、逆効果があります。ただ-O3-O2よりも優れていると思われ、-O2-O1よりも優れているはずです。実際はそれが実際どのように機能するかを意味するものではありません。

-O2または-O1で生成されたバージョンと比較して、-O3によって有効にされた「最適化」が実際にプログラムを遅くすることがあります。さまざまなレベルの最適化を試して、特定のコードに最適なものを確認する必要があります。実際に微調整したい場合は、個々のオプトマイゼーションのオン/オフを切り替えることもできます。

したがって、短期間では、-O3を使用することには欠点があります。私は個人的には、-O2で書かれた多くのものが-O3よりもうまく機能することを観察しましたが、実際にはプログラム固有のものです。


FYI、ここでは別のSOそれは-O2は、特定のプログラムのための-O3よりも良い結果与え理由を尋ねるの質問です:gcc optimization flag -O3 makes code slower then -O2

1

を「私は何を期待できるか知りたいのですが」

私は20年以上にわたり組み込みシステムでC++(主にvxWorksのGCC)を使用してきました。私はコンパイラ作家に敬意を表します。


トラストコンパイラ:IMHO、-O3は、任意のコードが破損したことがない...しかし、時々、面白いコーディングエラーを明らかにしました。


選択:チームは関係なく、-O1または-O3最適な、「あなたは何をテスト出荷、そしてあなたが出荷するかをテスト」するかどうかないを選択する必要があります。私が協力してくれたチームは、常に-O3で出荷してテストすることを約束してきました。


シングル・ステップは、非協力的になります-O3コードを使用した場合、個人練習のレベルでは、私は通常、GDB単一のステップを「放棄します」。私はブレークポイントをもっと活用し、自動変数(スタックデータ)とクラスデータをもっと「可視」にするために、コーディングの選択肢に多少の違いがあります。 (あなたはgdbコマンドをあなたの不便な友人 'p'にすることができます)。


シングル・ステップが必要です。でも、-O3を使用して、私たちの「テストと船」Dかかわらず、我々がほぼ独占的-O1コードを使用してデバッグますのでご注意ください。


デバッグがNecesaryです:デバッグとの間のトレードオフ-01まだテストおよび-O3を出荷するには2つの実行を切り替えるために必要な追加の再コンパイルです。コードバグを探索、識別、修正するために-O1に保存された時間は、2回の再構築(-01まで、そして-O3まで)を補う必要があります。


回帰テストの自動化は:おそらく、私がすべき...私は-O3の(統合テストや回帰テスト別名)システムテストはノッチそれをステップアップしていると言いたいが、私は本当にそれを記述することはできませんテストの自動化のレベルを高くすることをお勧めします(1回の退治テストごとに!)。確信はないけど。回帰テストの自動化レベルは、おそらくパフォーマンスレベルではなくチームサイズに関連しています。


「成功した」組み込みシステムは2つのことを行います。それは要件を満たす。さらに重要なのは、人間の目に見えるすべての動作において、軽く読み込まれたデスクトップのように機能することです。何らかのアクション(ボタン押下、ケーブル切断、テスト装置誘発エラー、またはステータスライトの変化が軽微であっても)は、人間の知覚可能な遅延はありません。 -O3が役に立ちます。成功したシステムができます...私はそれを見ました。

関連する問題