また、誰かがこのテーマに関する良いチュートリアルを教えてくれますか?見つかりません。
-fprofile-generateは、プロファイルコードでアプリケーションをインスツルメントします。アプリケーションは、実際の実行中に、この使用パターンがコンパイル時にわかっていればパフォーマンスを改善できる特定のイベントを記録します。ブランチ、インライン化の可能性などはすべてログに記録できますが、GCCがこれをどのように実装するかについて詳しくはわかりません。
プログラムが終了すると、このデータはすべて* .gcdaファイルにダンプされます。これは、基本的にテスト実行のログデータです。 -fprofile-useフラグを使用してアプリケーションを再構築した後、GCCは最適化を行うときに* .gcdaログデータを考慮に入れ、通常はパフォーマンスを大幅に向上させます。もちろん、これは多くの要因に依存します。
この例 から:
g++ -O3 -fprofile-generate [more params here, like -march=native ...] -o executable_name
// run my program's benchmarks, or something to stress its most common path
g++ -O3 -fprofile-use [more params here, like -march=native...] -o executable_name
基本的に、最初にコンパイルとリンクの両方を行うには、コンパイルとリンクの両方のために、この追加フラグを使用します:-fprofile-generate
(from here )。
次に、それを実行すると、デフォルトで.oファイルの「隣」に.gcdaファイルが作成されます(ビルドされたフルパスにハードコードされています)。
オプションで、-fprofile-dir = XXX setting を使用して、これらの.gcdaファイルを作成する場所を変更できます。
次に、-fprofile-use
パラメーターを使用して再コンパイルと再リンクを行い、プロファイルガイド付きの良さを使用してコンパイルします。
トリッキーなビットは、メイクファイルの設定です。
オブジェクトファイル用に個別の出力ディレクトリが必ず必要です。 「プロファイル」と「リリース」という名前を付けることをお勧めします。 GCCがリリースビルドステップでそれらを検出できるように、プロファイルの実行結果である* .gcdaファイルをコピーする必要がある場合があります。
結果はほぼ確実に高速になります。それもおそらくより大きくなります。 -fprofile-useオプションを使用すると、他の多くの最適化手順が有効になりますが、それ以外の場合は-O3によってのみ有効になります。