/ usr / bin / timeシェルコマンドで%e精度を上げる


19

シェルでtimeコマンドを実行するとtime ./myapp、次のような出力が得られます。

real    0m0.668s
user    0m0.112s
sys     0m0.028s

ただし、コマンドを実行する\time -f %e ./myappと精度が失われ、次のようになります。

2.01s

%Eコマンドを使用すると、同じように精度が失われます。さらに精度を上げるためにそれを変更するにはどうすればいいのですが、それでも秒が出力されるだけですか?

私はこのLinux / Unixコマンドに基づいて研究を行いました:時間この質問

回答:


21

これらのコマンドの両方が異なるバージョンの時間を呼び出していることを理解していると思いますよね?

bashの組み込みバージョン

% time

GNUタイム別名。/ usr / bin / time

% \time

組み込みtimeコマンドはbash、ここで読むことができます:

% help time
time: time [-p] PIPELINE
    Execute PIPELINE and print a summary of the real time, user CPU time,
    and system CPU time spent executing PIPELINE when it terminates.
    The return status is the return status of PIPELINE.  The `-p' option
    prints the timing summary in a slightly different format.  This uses
    the value of the TIMEFORMAT variable as the output format.

GNU time/usr/bin/timeは通常、組み込みよりも便利です。

精度の問題については、このgithubの要点で具体的に説明しています:

bash時間はGNU時間よりも正確なのはなぜですか?

組み込みのbashコマンドの時間は実行のミリ秒の精度を与え、GNUの時間(通常は/ usr / bin / time)はセンチ秒の精度を与えます。times(2)syscallはクロックで時間を提供し、100クロック= 1秒(通常)であるため、精度はGNU時間に似ています。より正確にするために使用するbash時間とは何ですか?

Bash時間は内部的にgetrusage()を使用し、GNU時間はtimes()を使用します。getrusage()は、マイクロ秒の解像度のため、はるかに正確です。

次の例でセンチ秒を確認できます(出力の5行目を参照)。

% /usr/bin/time -v sleep .22222
    Command being timed: "sleep .22222"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 0%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.22
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 1968
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 153
    Voluntary context switches: 2
    Involuntary context switches: 1
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

time次のようなbashのコマンドを使用すると、さらに解像度を上げることができます。また、解像度を制御できます。

# 3 places 
% TIMEFORMAT='%3R'; time ( sleep .22222 )
0.224

変数に関するBashマニュアルから:

TIMEFORMAT
The value of this parameter is used as a format string specifying how the timing information for pipelines prefixed with the time reserved word should be displayed. The ‘%’ character introduces an escape sequence that is expanded to a time value or other information. The escape sequences and their meanings are as follows; the braces denote optional portions.

%%
A literal ‘%’.

%[p][l]R
The elapsed time in seconds.

%[p][l]U
The number of CPU seconds spent in user mode.

%[p][l]S
The number of CPU seconds spent in system mode.

%P
The CPU percentage, computed as (%U + %S) / %R.

The optional p is a digit specifying the precision, the number of fractional digits after a decimal point. A value of 0 causes no decimal point or fraction to be output. At most three places after the decimal point may be specified; values of p greater than 3 are changed to 3. If p is not specified, the value 3 is used.

The optional l specifies a longer format, including minutes, of the form MMmSS.FFs. The value of p determines whether or not the fraction is included.

If this variable is not set, Bash acts as if it had the value

$'\nreal\t%3lR\nuser\t%3lU\nsys\t%3lS'
If the value is null, no timing information is displayed. A trailing newline is added when the format string is displayed.

はい、私はすでにすべてを知っていました。だから、私が欲しいのは不可能だと結論付けることができますか?bashの時間バージョンを使用して、3桁で実際のsecs時間のみを取得する方法はありますか?
Flame_Phoenix

私の更新を参照してください、変数TIMEFORMATを使用してbashの時間コマンドを制御できます。それはあなたが探しているものですか?
slm

うん、それだけです、ありがとう!しかし、どうすればそれをファイルに追加できますか?%TIMEFORMAT = '%3R'を使用しようとしています。time(sleep .22222)>> bla.txtが動作していません:Sとにかく、選択されています。カルマ++をお
届けできれ

2
TIMEFORMAT = '%3R'; time(sleep .22222)2 >> myFile.txt GOt it!
Flame_Phoenix

両方の長いユーザーと知らなかったTIMEFORMAT、私は常にリアルタイムを抽出するためにsedを使用していました。ありがとう!「マイクロ秒の解像度のため」。声明は私の希望を上げてそれTIMEFORMAT=%6Rがうまくいくだろうが、精度の桁は0-3しかないと思われる。
mxmlnkn
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.