Bash関数の個々の呼び出しを測定する方法~へbashファイル。
次のコマンドを使用するプログラムがあります。
eclipse -b col_solve.pl -e "myPred"
この呼び出しはいくつかの情報を出力し、その最後の情報はSUCCESSまたはFAILです。私はディレクトリ内の複数のファイルに対して呼び出されるスクリプトを作成しています。各ファイルの出力は
- 名前
- ステータス(成功または失敗)
- 実行にかかった(ユーザー)時間。
私が知っているコードは次のとおりです。
私はこれを使ってステータスを取得します(出力の最後の単語を検索します)。
stat=
get_stat ( ){
stat=$(awk '{print $NF}' <<< $1);
}
私はこれを使ってプログラムを呼び出します。
run_eclipse_on ( ){
get_stat "$(eclipse -b col_solve.pl -e "run(\"$1\")" )";
}
問題のコードは次のとおりです。
for i in `ls $1` ; #where $1 is the directory containing the files
do
tps=$(/usr/bin/time -f %U \ #to get just the user time
[run_eclipse_on $1/$i] ); # HERE it is!
echo $i::$stat::::$tps; # gives, for ex: file_name::SUCCESS::::0.20
done
犯人は関数を呼び出す行です。私はそれを `, {, [, $(, ') と"で囲みようとしました。何も動作しません...
それも可能だろうか…?
答え1
使用time
キーワード外部コマンドではなくキーワードを使用すると、time
単にプログラムを実行するのではなく、関数呼び出しを含むすべてのシェルコマンドを実行できます。次のように出力形式をある程度制御できます。TIMEFORMAT
変える。
TIMEFORMAT=%2U
time run_eclipse_on …
echo "$i::$stat"
ただし、出力はtime
独自の行に印刷されます。 Bashはトリックを許可します。TIMEFORMAT
コマンド中に変更を実行して、より多くの内容を埋めることができます。
time { run_eclipse_on …; TIMEFORMAT="${i//%/%%}::${stat//%/%%}::%2U"; }
出力はtime
標準エラーで印刷されます。標準出力に必要な場合を使用してください2>&1
。ただし、これにより、stderrに印刷されるすべてのコマンドもリダイレクトされます。標準エラーを保存するには、次のようにします。ファイル記述子の混合。
{ time { {
run_eclipse_on …;
TIMEFORMAT=$stat::%2U;
} 2>&3; } 2>&1; } 3>&2
答え2
次のようなものが欲しいようです。
#!/bin/bash
for f in "$1"/*; do
time eclipse -b col_solve.pl -e "$f" | tail -n 1
done
以下の場合を除き、シェルスクリプトで関数を使用しないでください。実際に彼らが必要です。シェルスクリプトを使用すると、他のツールを簡単に調整できるという利点があります。非シェルツールにアクションを実行させる。シェルを使用して他のツールを一緒にまとめます。
追加資料:
答え3
「ユーザー時間」と同じではありませんが、経過時間が十分な場合は、開始時間と終了時間を保存し、関数呼び出しで経過時間を計算する別のオプションがあります。timer
リストされた機能こここれをより簡単にしてください。
簡単に参照できるように、関数をここにコピーしました。
# Elapsed time. Usage:
#
# t=$(timer)
# ... # do something
# printf 'Elapsed time: %s\n' $(timer $t)
# ===> Elapsed time: 0:01:12
#
#
#####################################################################
# If called with no arguments a new timer is returned.
# If called with arguments the first is used as a timer
# value and the elapsed time is returned in the form HH:MM:SS.
#
function timer()
{
if [[ $# -eq 0 ]]; then
echo $(date '+%s')
else
local stime=$1
etime=$(date '+%s')
if [[ -z "$stime" ]]; then stime=$etime; fi
dt=$((etime - stime))
ds=$((dt % 60))
dm=$(((dt / 60) % 60))
dh=$((dt / 3600))
printf '%d:%02d:%02d' $dh $dm $ds
fi
}
お客様の場合は、この機能を含めて次のことを行います。
for i in *
do
t=$(timer)
run_eclipse_on $i
elapsed=$(timer $t)
echo $i::$stat::::$elapsed # gives, for ex: file_name::SUCCESS::::0:00:03
done