プロファイラー
CLion の CPU プロファイラー統合により、アプリケーション (カーネルとユーザーコードの両方) で収集されたパフォーマンスメトリクスを分析できます。 プロファイラーは Linux と macOS で使用でき、実装はそれぞれ Perf(英語) および DTrace(英語) ツールに基づいています。
Perf および DTrace は、一定間隔でサンプリングを行いアプリケーションを割り込み、プログラムカウンターやスタックトレースを収集し、それらをプロファイリングレポートに変換します。 このようなレポートは長くなり、解析が難しい場合があるため、CLion ではプロファイラーの出力データを可視化します。
前提条件
特定のカーネルリリース 用に Perf ツールをインストールします。
uname -rを使用して正確なバージョンを確認し、対応する linux-tools パッケージをインストールします。 例:$ uname -r 4.15.0-36-generic $ sudo apt-get install linux-tools-4.15.0-36-genericカーネルオプションを調整する
perf_event_paranoid-root 以外のユーザーによるパフォーマンスイベントデータの使用を制御します。
プロファイラーが root 権限なしでパフォーマンス情報を収集できるようにするには、値を 2 未満に設定します:
sudo sh -c 'echo 1 >/proc/sys/kernel/perf_event_paranoid'可能な値の説明は カーネルドキュメント で確認できます。 通常、
1または0でプロファイラーの実行とデータ収集が可能です。 ただし、空のプロファイリング結果(プロファイラーデータなし メッセージ)が表示される場合、システム設定によっては-1- 最も安全性の低いオプションですべてのユーザーのパフォーマンスイベント利用を許可するものが必要な場合があります。kptr_restrict- カーネルアドレスの公開に関する制限を設定します。
カーネルシンボルを適切に解決するには、値を 0 に設定して、 kptr_restrict によって提供される保護を無効にします。
sudo sh -c 'echo 0 >/proc/sys/kernel/kptr_restrict'
デフォルトでは、これらの変更は現在の OS セッションにのみ影響します。 システムを再起動して設定を保持するには、次のコマンドを実行します。
sudo sh -c 'echo kernel.perf_event_paranoid=1 >> /etc/sysctl.d/99-perf.conf' sudo sh -c 'echo kernel.kptr_restrict=0 >> /etc/sysctl.d/99-perf.conf' sudo sh -c 'sysctl --system'プロファイラーの最初の起動時に、CLion はカーネル変数がすでに設定されているかどうかを確認し、必要な変更を提案します:

唯一必要なツールは DTrace で、macOS にデフォルトでインストールされています。 ターミナルで
dtraceコマンドを呼び出して確認してください。
CLion は、その場所が PATH 環境変数に含まれている場合、 Perf または DTrace 実行可能ファイルを自動検出します。 でパスを手動で設定することもできます。
CPU プロファイリング
ビルドの準備
プロファイラはデバッグ情報を利用して意味のある出力データとナビゲーションを提供するため、 デバッグ 構成をプロファイリングに使用することをお勧めします。
インライン化などのコンパイラーの 最適化 は、プロファイル結果に影響を与える可能性があります。 インライン化のためにフレームが失われないようにするには、 CMakeLists.txt で最適化レベルを
-O0に設定します。set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O0") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O0")また、コンパイラーは最適化のためにフレームポインタレジスタを汎用レジスタとして使用することがありますが、これによりスタックトレースが壊れる可能性があります。 Linux では、プロファイラ実装はこれに依存しませんが、macOS では、 gcc に
-fno-omit-frame-pointerコンパイルフラグを設定し、 clang に-fno-omit-frame-pointerと-mno-omit-leaf-frame-pointerの両方を設定することをお勧めします。
サンプリング周波数を設定する
デフォルトのサンプリングレート値はかなり高く、長時間実行するプログラムには多くのディスク容量が必要になる場合があります。
必要に応じて、 でプロファイラーのサンプリング周波数を変更できます。

サンプリングレートを選択する場合、システムでスケジュールされる可能性のある タイマー駆動の他のアクティビティを気にします。 例として、サンプリング周波数が 100Hz のその他の可能なアクティビティでのロックステップサンプリングを回避するために、デフォルト値は 100 ヘルツではなく 99 ヘルツに設定されます。
パフォーマンス出力ディレクトリを設定する (Linux)
デフォルトでは、 Perf の出力は /tmp に配置されますが、これは容量が制限されている可能性があります。 プロファイリング中にいっぱいになると、プログラムはエラーで終了します。 これを回避するために、 での出力のプロファイリングに使用される別のディレクトリを構成できます。

プロファイラを実行する
次のいずれかのオプションを使用します。
ツールバーのリストから実行構成を選択し、
をクリックするか、メインメニューから を呼び出します:

または、プロファイルしたいプログラムエントリポイントまたは関数の左側ガターメニューから
プロファイリング を選択します:

プロファイラーを実行中のプロセスにアタッチすることもできます( を呼び出します)。

プロファイリングを起動すると、CLion はプロファイラーの接続が正常に行われたかどうか通知します。
アプリケーションが停止し、プロファイリングデータの準備が整うと、CLion は CPU プロファイラツールウィンドウ へのリンクを含むバルーンを表示します(メインメニュー からもアクセスできます)。

アプリケーションを停止する前にプロファイラーを停止するには、プロファイラーツールウィンドウの 停止 ボタンを使用します。
プロファイリングレポートを読む
CPU プロファイラーツールウィンドウでは、収集データは Flame Graph、 Call Tree、 Method List のタブで表示されます。 左側には、アプリケーションスレッドと 全スレッドマージ済み が一覧表示されます。 Linux では、プログラムで設定されている場合は CLion に意味のあるスレッド名が表示され、macOS ではスレッド名が ID として表示されます。

レポートを移動する
プロファイラー ツールウィンドウを使用すると、特定の機能に集中したままタブ間を移動できます。
必要な関数を右クリックし、それを開く別のビューを選択します。
選択した関数を別のタブ(例: メソッドリストのメソッドに注目 でフレームグラフブロック)で探します。

ソースコード(ソースに移動 )に移動します。
フレーム情報をクリップボードにコピーします。フレーム名(フレームのコピー )のみ、またはスタック最下部から選択したフレームまでのフレーム名のシーケンス(スタックからフレームまでコピー )です。
フレームグラフ
Perf または DTrace で収集された生のプロファイリングデータは、呼び出しツリーの概要です。 フレームグラフ では、これをスタックトレースの集まりとして可視化します。長方形はコールスタックのフレームを表し、幅で並べられます。
各ブロックはスタック (スタックフレーム) 内の関数を表します。 各ブロックの幅は、関数が使用した CPU 時間に対応します。 Y 軸には、下から上にスタックの深さが表示されます。 X 軸は、最もリソースを消費する関数から最もリソースを消費しない関数までソートされたスタックプロファイルを示します。
フレームグラフを読み取るときは、 最も幅の広いブロック に注目してください。 これらのブロックは、プロファイルで最も多く表示される機能です。 親関数から子関数へのコードフローに従って、下から開始して上に移動することも、逆の方向を使用して、CPU 上で直接実行されている関数を示す上部のブロックを探索することもできます。
ツールチップに詳細を表示する
ブロックの上にマウスを置くと、ツールヒントが表示されます。

ツールチップには、完全修飾関数名、親サンプル時間の割合、合計サンプル時間の割合が表示されます。
グラフをズームする
および
オプションを使用して、グラフをズームします。
特定の関数に注目するには、グラフ上の対応するブロックをダブルクリックします。
グラフの元のサイズに戻すには、 1:1 をクリックします。
グラフを検索する
グラフ上で特定の関数を見つけたい場合は、その名前の入力を開始します。 グラフは、検索リクエストに一致する名前のすべてのブロックをハイライトします。
検索結果間の高速ナビゲーションには、
および
を使用します。 グラフ全体または特定のサブツリーのみを検索することもできます。

グラフをキャプチャーする
レポート内の他のデータとは別にグラフをキャプチャーしてエクスポートできます。
をクリックして クリップボードにコピーかコピー を選択するか、 保存 をクリックしてグラフを .png 形式のイメージとしてエクスポートします。
呼び出しツリー
呼び出しツリー タブは、プロファイリング中にサンプリングされたプログラムのコールスタックに関する情報を表します。 トップレベルの 全スレッドマージ済み オプションは、すべてのスレッドが 1 つのツリーにマージされたことを示します。 スレッドごとにトップダウンの呼び出しツリーもあります。

タブには機能ごとに次の情報が表示されます。
関数の名前
合計サンプル時間または親のサンプル時間の割合
総サンプル数
再帰呼び出し
再帰呼び出しを折りたたむ
複雑なアプリケーションで複数の再帰関数がある場合、解析が非常に難しくなることがあります。 通常の呼び出しツリービューでは、再帰呼び出しは呼ばれた順に次々に表示され、複雑なコールスタックで複数の再帰呼び出しがあると、ほぼ無限にスクロールすることになります。
CLion は、同じ関数がコールスタックの上位で呼び出された場合に再帰を検出します。 この場合、サブツリーは呼び出しツリーから取り出され、その関数の最初の呼び出しに再び接続されます。 こうすることで、再帰をバイパスし、ほとんどのリソースを消費する関数とその呼び出しに焦点を当てることができます。
再帰呼び出しを折りたたむことで、再帰がなかったかのように、これらの呼び出しに対する経過時間の合計を確認できます。

折りたたまれた再帰呼び出しは、 呼び出しツリー タブの アイコンでマークされます。 クリックすると、別のタブで再帰呼び出しツリーが開きます。 マージされたスタックの数をツールチップでプレビューできます。

仮に: 特定の機能に焦点を当てる
CLion では、呼び出しツリー内の特定の関数を調査できます。特定の関数を除外したり、逆に今関心のある関数だけに絞ることも可能です。
呼び出しツリー タブで必要な関数を右クリックし、次のオプションのいずれかを選択して、専用のタブで結果を開きます。
サブツリーにフォーカス: 選択した関数呼び出しのみを表示します。 親関数のサンプル時間カウンターには、選択したサブツリーで費やされた時間のみが表示されます。
呼び出しにフォーカス: 選択した関数とそれを呼び出す関数を表示します。 このオプションを有効にすると、各時間フレームには、選択した機能に費やされた時間のみが表示されます。
サブツリーを除外: 選択した関数呼び出しを無視します。
呼び出しを除外: 選択した関数への呼び出しをすべて無視します。

呼び出しのフィルター
コールツリーでフレームを折りたたむ / 展開することができます。 これは、たとえば、特定のフレームワークからライブラリクラスまたはクラスを非表示にして、アプリケーションコードに集中したい場合に便利です。
ツリーで上下の矢印を使用して、呼び出しを表示または非表示にします。

でコールツリーフレームを折りたたむために使用されるパターンのリストを確認して調整できます。

メソッドリスト
メソッドリストは、プロファイリングされたデータ内のすべての関数を収集し、累積サンプル時間で並べ替えます。

サンプル 列には、各関数のサンプルの合計数が表示されます。 独自のサンプル 列は、スタックトレースが現在の関数 (呼び出し先ではない) で終了するサンプルの数を示します。 独自のサンプル 値は、他の関数を呼び出さない長時間実行される関数を調べるときに役立つ場合があります。
リストの各関数について、 バックトレース および マージされた呼び出し先 を表示できます。
プロファイラーの結果のエクスポートとインポート
CLion では、すべてのプラットフォームでプロファイリング結果をエクスポート / インポートできます。 これは、 リモートまたは 組み込みターゲットでプロファイルを作成し、結果をローカルにインポートする場合に特に役立ちます。
プロファイリング結果のエクスポート
プロファイラー ツールウィンドウ () の左フレームで
をクリックします。
開いたダイアログで、ファイルに名前を付け、保存するフォルダーを指定して、 保存 をクリックします。
結果は .collapsed ファイルにエクスポートされます。 このファイルには FlameGraph スクリプトで使われるフォーマットのコールトレースが含まれます。 このフォーマットは標準化されており、コールスタックの集合を表します。各行は、フレーム名をセミコロンで区切ったリストの後にカウンターが続く形式です。
プロファイリング結果のインポート
メインメニューから を選択します。
新しいファイルまたは最近開いたファイルのいずれかを選択します。