web-dev-qa-db-ja.com

GCC:-O3と-Osの違い

GCC -O3フラグについてはよく知っていますが、-Osとはどう違うのですか。

24
Saqlain

GCC documentation は、これらのオプションが非常に明示的に行うことを説明しています。

-O3は、パフォーマンスのためにコードを非常に大きく最適化しようとします。 -O2に含まれるすべての最適化に加えて、さらにいくつかが含まれます。

一方、Osは、GCCに「サイズの最適化」を指示します。実行可能ファイルのサイズを増加させないすべての-O2最適化を有効にし、さらにいくつかの最適化フラグを切り替えて実行可能ファイルのサイズをさらに縮小します。

私の説明は意図的に少しあいまいになっていることに注意してください。どちらの最適化レベルでどのフラグが有効になっているかの詳細については、GCCのドキュメントを参照してください。

-O *最適化レベルは、相互に排他的で、明確なlevels最適化レベルであると思います。 2つのレベルがフラグを有効化または除外するのは、他のレベルが(それぞれ)意図的に除外または有効化するためです。混合して一致させたい場合(特定のフラグセットが必要な正当な理由がない限り、おそらく実際にこれを行いたくないでしょう)、ドキュメントを読んで各レベルでフラグを混合して一致させるのが最善です手で有効にします。

この記事 Gentoo Linux Wikiからもリンクすると思います。GentooLinux Wikiでは、オペレーティングシステム用のパッケージの構築に関連する最適化フラグについて説明しています。明らかにこれのすべてが適用可能であるわけではありませんが、いくつかの興味深い情報がまだ含まれています-1つについて

-O3を使用したコンパイルは、パフォーマンスを向上させる保証された方法ではありません。実際、多くの場合、バイナリが大きくなり、メモリ使用量が増えるため、システムの速度が低下する可能性があります。 -O3は、いくつかのパッケージを破壊することでも知られています。したがって、-O3の使用は推奨されません。

その記事によると、-O2は、ほとんどの場合、-O3と同程度であり、壊れた実行可能出力に関しては、より安全に使用できます。

25
CmdrMoozy

場合によります。速度またはサイズを最適化する必要がありますか?

-O3
さらに最適化。 -O3は、-O2で指定されたすべての最適化をオンにし、-finline-functions、-funswitch-loops、-fpredictive-commoning、-fgcse-after-reload、-ftree-loop-vectorize、-ftree-slp-vectorizeもオンにします、-fvect-cost-model、-ftree-partial-pre、および-fipa-cp-cloneオプション。

-O0
コンパイル時間を短縮し、デバッグで期待どおりの結果が得られるようにします。これがデフォルトです。

-Os
サイズを最適化します。 -Osは、通常コードサイズを増加させないすべての-O2最適化を有効にします。また、コードサイズを削減するために設計されたさらなる最適化も実行します。
-Os次の最適化フラグを無効にします。

-falign-functions-falign-jumps-falign-loops-falign-labels-freorder-blocks-freorder-blocks-and-partition-fprefetch-loop-arrays

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

実際、-Oは、独立した最適化の長いリストの省略形です。必要なものがわからない場合は、-O3に進みます。

3
opalenzuela

-O3は速度を最適化し、-Osはスペースを最適化します。つまり、-O3は高速な実行可能ファイルを提供しますが、かなり大きくなり、-Osは小さな実行可能ファイルを提供しますが、低速になる可能性があります。

通常、スペースと時間の効率はトレードオフです。より高速なアルゴリズムはより多くのスペースを使用する傾向があり、インプレースアルゴリズム(スペース使用量を増加させないアルゴリズム)は効率が低下する傾向があります。

通常、最新のコンピューターには十分なメモリスペースがあるため、通常は-O3が適しています。ただし、低容量(小さなデバイスなど)で何かをプログラミングする場合は、-Osをお勧めします

0
Nathan