#Linuxのgccの#コンパイラの最適化-O0 -O1、-O2、-O3 -OS説明

GCCは時間をコンパイルするために使用される最適化オプションの数、ターゲット・ファイル・サイズ、トレードオフとバランスの三つの異なる寸法の効率を提供します。

共通のgccコンパイラー・オプション 

  • のみ-cコンパイルとは、オブジェクト・ファイルを生成します。 
  • -EはCプリプロセッサを実行します。 
  • -gデバッグ情報を生成します。GNUデバッガはこの情報を使用することができます。 
  • -Os比較的言語-O2.5。 
  • -o FILEは、指定した出力ファイルを生成します。実行ファイルで使用する場合。 
  • -O0は、処理を最適化していません。 
  • または-O -O1生成されたコードの最適化。 
  • -O2さらに最適化されました。 
  • -03インライン関数を含むさらなる最適化、-O2より。 
  • 共有オブジェクトファイルを生成する-shared。多くの場合、共有ライブラリを構築する際に使用されます。 
  • 提供することができますgccのすべての警告を開く-W。 
  • -wは、警告メッセージを生成しません。 
  • すべての警告を生成-Wall。

私たちの最適化オプションと各レベルは、次の4つの詳細は-O0、-O1、-O2、-O3のために最適化されています

-O0

-O0:デフォルトのコンパイラオプションで任意の最適化を、行いません。 

-O1

-O1:最適化は、それがコード、定数のメインブランチである、との表現を最適化した、はるかに少ないコンパイル時間を消費します。 

-Oと-O1:、大規模な機能のためのプログラムのコンパイラの最適化の一部を行うコンパイラもう少し時間を最適化し、かなりのメモリを占有します。この用語の最適化の使用は、生成されたコードのサイズを小さくすると、実行時間を短縮するが、コンパイルに多くの時間を取るために、最適化の必要性を実行していないコンパイラの試み。-O1オープンチューニングオプション: 

  • -fdeferポップL:スタックの遅延時間をポップ。関数呼び出しが完了すると、パラメータがすぐにスタックからポップしませんが、複数の機能が呼び出され、ワンタイム・ポップ。 
  • L -fmerge-定数:定数(文字列定数および浮動小数点定数)で同じ符号化単位をマージしようとする試み 
  • Lは-fthread-ジャンプ:ジャンプの分岐先は、他の比較条件があり、比較の条件は第1の比較文を含み、その後条件に応じて最適化されたこの実装は、フロントピース真であるか偽である場合。第二分岐または第二のブランチへのリダイレクト先は枝を追いました。 
  • L -floop-最適化:最適化ループを実行し、定数式は簡素化決意条件に循環ループから除去し、必要に応じて強度低下を行う、またはサイクルを開くように。大規模かつ複雑なサイクルでは、この最適化がより重要。 
  • -fif変換L:等価非分岐パターンに条件ジャンプしようとします。最適化の実装は、移動状態、MIN、MAX、フラグがセットされ、そしてABS命令、及び一部の演算能力が挙げられます。  
  • -fif-conversion2基本的な意味Lは、これ以上の説明を見つけました。 
  • L -fdelayed分岐:この技術の試みは、命令サイクル時間に応じて命令を再スケジュールします。また、フロントに移動するために多くの条件分岐命令として入れしようとするので、プロセッサのキャッシュ管理を最大限に活用。 
  • 異なるコンパイラのコンパイルにつながる可能性が利用可能でないフィードバックまたは__builtin_expectをプロファイリングするとき、ランダムパターンコンパイラ可能性推測分岐が行われ、アセンブリコードに対応する位置を移動させる、:リットル-fguess分岐確率非常に異なるオブジェクトコード。 
  • L -fcprop-レジスタ:可変レジスタ、コンパイラが実行依存性を低減するために、第2検査スケジュールに割り当てられた機能ので(二つのセグメントが同じレジスタを必要とする)、不要なレジスタのコピー操作を除去します。 

-O2

-O2:「レジスタステージのより多くの命令レベルの最適化と最適化を試みるでしょう、それはコンパイル時に、より多くのメモリと、コンパイル時間がかかります。 
GCCは、時間と空間の最適化が含まれていないほとんどすべての妥協の実行されます。O2を設定する場合、コンパイラは循環オープン()ループ展開と関数はインライン展開しません。基盤上のO1、O2の最適化の増加コンパイル時間と比較して、生成されたコードの効率を改善します。O1 O2は、すべてのオプションを開き、次のオプションを開きます。 

  • L -fforce-MEM:演算を行うこと、およびその後、コピーメモリデータレジスタを行うように強制する前に。これは、共通部分式、命令マージレジスタは、個々の排気がロードされていない場合、すべての共発現潜在的なメモリ参照、ひいてはより効率的なコードの出力を発生します。この最適化変数は、単一の命令を必要とするので、多分最適化の結果の多くがあるでしょう。しかし、関与している多くの変数のために、その後の命令(必須数学演算)、これは非常に重要な最適化であるだろう、なぜなら値とアクセスメモリに比べ、プロセッサへのアクセスははるかに高速の値を登録します。 
  • リットルの-foptimize-兄弟-通話:最適化と再帰の終了に関連した呼び出し。一般的に、再帰関数呼び出しの代わりにブランチを使用しての、一般的な一連の命令に展開することができます。このような命令キャッシュプロセッサは、命令をロードし、拡大するためにそれらを処理し、命令が分岐動作に比べて、別の関数呼び出しのままで、より速くする必要がありますすることができます。 
  • -fstrength-減らすリットル:最適化サイクルと繰り返し変数の除去を実行するために、この最適化手法。ループは、次に演算ループカウンタ変数を使用して行われるため、次には、そのような変数を使用するように、可変反復ループカウンタ変数に結び付けられます。 
  • lは-fcse-フォロージャンプ:ターゲットが他のパスまでのジャンプではありません共通部分式除去は、式全体をスキャンするためにジャンプしたとき。記事がfalseの場合例えば、共通部分式除去時に...他に遭遇した場合は...文を、その後、共通部分式除去はジャンプに従います。   
  • -fcseスキップブロックL:と同様ことを除いて、-fcse-フォロージャンプし、特定の条件に応じて、ジャンプに続くは、CSEブロック全体であろう 
  • リットル-frerun-CSE-後のループ:最適化サイクルが完了した後、再操作する共通部分式除去。 
  • リットルの-frerunループ-OPT:二つの実験ループ最適化リットルの-fgcse:グローバル共通部分式除去のパスを実行します。パスは、グローバル定数とコピー伝播を行います。これらの分析は、冗長コードを排除するために、アセンブリ言語コード、およびその一般的な結合断片の動作を最適化しようとして生成されました。コードは、計算goto文を使用している場合は、gccの命令は-fno-GCSEのオプションをお勧めします。 
  • L-fgcse-LM:グローバル共通部分式除去が唯一のロード操作を殺す保存されている独自の位置を移動しようとします。これは、(一つのみロードする必要がある)循環におけるコピー/ストア・シーケンスへの変更を負荷サイクルの外部に循環ロード/ストアの動作のシーケンスの転送を可能にします。-fgcseを選択した後、デフォルトでオンになって。 
  • L個の-fgcse-SM:バックグローバル共通部分式除去にストア動作を渡す場合、このパスは、ループ外へのストア動作に転送しようと試みます。-fgcse-LMで使用した場合、ロード/ストア・オペレーションがロードする前にループに変換され、ストアサイクルの後、それによって、作業効率を向上させる、不要な操作を減らします。 
  • -fgcseラスL:グローバル共通部分式除去のパス(完全にまたは部分的に)一般的に同じ負荷である不要なロード・ストア・バック動作を排除し、メモリセルに格納します 
  • L-fdeleteヌル・ポインタ・チェック:グローバル・データ・ストリームの分析、同定および無駄NULLポインタを排出するためのチェック。コンパイラは、NULLポインタへの間接参照は、プログラムを停止するものとします。ポインタ参照をチェックした後ならば、それは空にすることはできません。 
  • リットル-fexpensive-の最適化:ビューのコンパイラの視点からいくつか、高価な最適化(この最適化は、プログラムの実行が大きな利点ではないかもしれないとさえ非常に効率的ではないと言われて、コンクリートが非常に明確ではありません) 
  • Lの-fregmoveは:コンパイラは、結合レジスタの数を最大化するように、単純な命令、又は他の動作の他の同様の数のレジスタムーブ命令の数を再割り当てしようとします。特に機械命令のオペランドのためのこの最適化は、より有用ビス。 
  • リットルの-fschedule-たinsn:コンパイラの並び替え命令によるデータを待っているに遅れを解消しようとする準備ができていません生成されます。この最適化は、マシンを遅くし、浮動小数点演算命令のロードメモリが完了、または浮動小数点命令再び必要CPUれるまで、この時点で他の命令の実行を許可するので、メモリ命令は、助けをロードする必要が実行されます。リットル 
  • -fschedule-insns2:類似-fschedule-たinsn。しかし、レジスタ割り当てが完了すると、追加の命令をプログラムするための要求を渡します。小さいレジスタのこの最適化、およびロードメモリの動作クロックサイクル時間は、非常に良好な結果が得マシンよりも大きくなります。 
  • L -fsched-ブロック間:この手法は、命令のブロックを横切ってスケジュール命令にコンパイラを可能にします。これは、待機中に完了した作業を最大化するためにコマンドを移動するのは非常に柔軟であることができます。 
  • lは-fsched-SPEC-負荷を:ロード命令は、いくつかのいくつかの投機的な操作を可能にします。(具体的には未知の)機能、ならびに同じ-fsched-SPEC-負荷危険な、より多くの投機的なロード命令の動作を可能にします。これらのオプションの両方がデフォルト際-fschedule-たinsnにより選択されます。 
  • Lの-fcallerは、保存しますコール・レジスタの格納および回復を回避する方法によって呼び出すので、一度に表示される値を呼び出すための呼レジスタに割り当てることができるが、唯一のより良いコードを生成するために使用しました。(複数の関数を呼び出した場合は、一度だけの操作を保存し、復元するために、各関数呼び出しのレジスタで実行されていないので、これは、時間を節約することができます。) 
  • L -fpeephole2:コンピュータが(それが何を意味するか分からない)特定のピープホール最適化を実行することができ、 - その差fpeepholeの-fpeephole2と異なるコンパイラさまざまな方法で、-fpeepholeの使用により、いくつかの使用-fpeephole2、 2が使用されているにもあります。 
  • -freorderブロックL:コードの局所性を向上させるために枝の数を減らすことを目的とした際にコンパイルされた関数、基本ブロックを並べ替えます。 
  • -freorder関数L:コードの局所性を向上させるために分岐数を減らすことを目的とした場合にコンパイルされた関数、基本ブロックを並べ替えます。情報が既に存在している特定のに応じて、このような実施形態の最適化:実行していない実質的に通知するため、高機能のアクセス頻度を知らせる.text.unlikely機能.text.hot。 
  • L個の-fstrictエイリアシング:この手法は、厳密なルール変数を課すための高レベルの言語です。およびC AのC ++プログラムは、データ・タイプ間で共有変数、例えば、変数および単精度浮動小数点変数整数が同じメモリ位置ではないことを保証するものではありません。 
  • Lは-funitアット時間:コード生成の前に、全体のアセンブリ言語コードを分析します。これは、いくつかの追加の最適化を実行するようになりますが、コンパイラのニーズの間に大量のメモリを消費します。(データは、言った:これは、コンパイラが最適化命令キャッシュするために多くの時間を消費しないコードを並べ替えることができますことができます) 
  • L -falign-機能:このオプションは、メモリ機能、特定の境界内の開始位置を整列させるために使用されます。ほとんどのプロセッサは、ページメモリによって読み込まれ、すべての機能コードは、メモリの1ページ内に位置していることを保証するために、コードがJiaohuaがページを希望必要はありません。 
  • L -falign-ジャンプ2つの境界のn乗に整列支店コード。この場合、ダミー命令(ダミー演算)を行うことなく 
  • L -falign-ループ:2の境界n乗を整列させるループ。ダミーの操作を実行するのにかかる時間を補償するための複数のサイクルを実行することが期待できます。 
  • 二つの境界のn乗に整列分岐:L -falign-ラベル。ブランチは、コードの通常の流れに到着したときに、必要にダミー操作の数を挿入するため、このオプションは、低速のコードを作るのは簡単です。 
  • Lの-fcrossjumping:これは、プログラム全体に分散されているのと同じコードを組み合わせるためにコード変換処理を飛び越えています。これは、コードの長さを減少させるが、プログラムの性能に直接的な影響を有していなくてもよいです。  

-O3

-O3:もっとO2に基づいて最適化されたため。例えば、擬似のネットワーク、通常のインライン関数を登録し、そしてより多くのサイクルのために最適化。O2に基づき最適化、最適化と開かれ、次のオプションのすべてが含まれています。 

  • リットル-finline-機能:呼び出された関数へのインラインシンプルな機能。
  • Lの-fweb:疑似レジスタの建設ネットワークの変数を格納します。擬似レジスタは、それらが同一のレジスタであるかのようにデータが含まれ、そのようなCSEおよびループ最適化技術のような他の最適化技術、様々な最適化するために使用することができます。変数は、もはや元のレジスタに格納されていないので、この最適化は、より不可能デバッグます。 
  • L個の-frename-レジスタ:レジスタ割り当て後、スプリアス依存所定のコードを避けるために残さレジスタを使用することによって。変数は、もはや元のレジスタに格納されていないので、これは、デバッグにそれを非常に困難にします。 
  • リットル-funswitchループ:いいえ変更のサイクルのうち、条件分岐、結果は、コピーサイクルに置き換えられます。

-The

-Os:-O2.5の同等。これは、すべての最適化オプション-O2ではなく、メソッドのコードサイズ縮小の使用です。


公式ドキュメントではGCCはまた、-Os上のノートを見つけています:
http://gcc.gnu.org/onlinedocs/gcc-3.4.6/gcc/Optimize-Options.html#Optimize-Options
 

公開された170元の記事 ウォンの賞賛207 ビュー459万+

おすすめ

転載: blog.csdn.net/xiaoting451292510/article/details/104977828