2017-06-29 5 views
2

コードベース内の各ファイルのコンパイルにかかる時間を計測しようとしています。時間の出力とそれがタイミングだったコマンドを単一の行として書き出します

this SO answerによると、あなたは回、実際のコンパイルを行い、その後、ファイルに

/tmp/time-buildを結果を格納するスクリプトを書くことができますが:

#!/bin/bash 
{ time g++ "[email protected]"; } 2> >(cat <(echo "g++ [email protected]") - >> /tmp/results.txt) 

cmakeのを呼び出すときには、その後、CMAKE_CXX_COMPILERを上書きすることができますmakeはスクリプトを使ってコンパイルを実行します。

cmake .. -DCMAKE_CXX_COMPILER=/tmp/time-build 
make 

これは宣伝通りに動作し、利回りは以下のような結果:

real 0m1.190s 
user 0m1.044s 
sys  0m0.140s 
g++ -Werror -Wall -Wextra ... /src/test/foo.cpp 

をただし、処理を容易にするために、私はreal時間を保存したいと思いますし、それがg ++と同じ行にを持っていますコマンド。

質問:

私のコマンドラインのfuではありません、これを回すのタスクまで:時間のreal出力をキャプチャし、そして一緒にそれを含むコマンドの中へ

{ time g++ "[email protected]"; } 2> >(cat <(echo "g++ [email protected]") - >> /tmp/results.txt) 

echo "g++ [email protected]"を1行に入力します。

私は上記のコマンドの>(cat <() -部品が何を意味するのか分からない、とgrep realechoを組み込むために、私の試みは

私はそれをどのように行うことができますが失敗していますか?

また、処理される各ファイルの出力タイミングをcmakeに与えるより慣れた方法があれば、それも理想的です。

+1

「sed」トリッキーインラインのビットを追加しますか? –

+0

@πάνταῥεyouあなたは何かを提案できますか? –

+0

さて、私のsed fuはちょうど少し錆びました;-)。あなたは[related](https://stackoverflow.com/questions/5962285/cmake-compilation-statistics)の質問を見つけましたか? –

答えて

3

おそらく、CMakeベースのプロジェクトのコンパイル時間を得る最も良い方法は、makeの代わりにninjaを使用することです。これを行うには

あなたは、設定中に忍者ジェネレータを指定する必要があります。

cmake -G Ninja <...> 

を次に忍者を使用して構築:その後

ninja 

を、.ninja_logというファイルを見てください。最初の列はミリ秒単位の開始時間、2番目は終了時間、4番目はターゲット名、最後は使用されたコマンドラインのハッシュです。

このログを表示して分析するソリューションもあります。ninjatracingは、.ninja_logをChromeのトレースツールで読み取り可能な形式に変換します。

+0

ありがとう、それをチェックアウトします! –

1
cmd=(clang "[email protected]") 
{ time "${cmd[@]}"; } 2> >(tee >(real=$(grep -Po 'real\K.*'); echo "${cmd[*]} $real" >>result.txt)) 
関連する問題