Tingkatkan% e precision dengan perintah / usr / bin / time shell

19

Ketika saya menjalankan perintah waktu di shell time ./myappsaya mendapatkan output seperti berikut:

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

Namun, ketika saya menjalankan perintah \time -f %e ./myappsaya kehilangan presisi dan saya mendapatkan:

2.01s

Jika saya menggunakan %Eperintah saya juga kehilangan presisi dengan cara yang sama. Bagaimana cara mengubahnya agar lebih presisi lagi, tetapi masih hanya memiliki detik yang dikeluarkan?

Saya mendasarkan penelitian saya di Linux / Unix Command ini: waktu dan pada pertanyaan ini

Flame_Phoenix
sumber

Jawaban:

21

Saya berasumsi Anda mengerti bahwa kedua perintah ini memanggil versi waktu yang berbeda, bukan?

versi built-in bash

% time

Waktu GNU alias. / usr / bin / waktu

% \time

Built-in timeperintah untuk bashdapat membaca tentang di sini:

% 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/timebiasanya lebih bermanfaat daripada built-in.

Mengenai masalah presisi Anda, hal ini dibahas di sini di github gist ini , khususnya:

Mengapa waktu bash lebih tepat daripada waktu GNU?

Waktu perintah builtin bash memberikan ketepatan eksekusi milisecond, dan waktu GNU (biasanya / usr / bin / waktu) memberikan ketepatan centisecond. Kali (2) syscall memberi waktu di jam, dan 100 jam = 1 detik (biasanya), jadi presisi seperti waktu GNU. Apa yang digunakan bash time sehingga lebih tepat?

Waktu Bash secara internal menggunakan getrusage () dan waktu GNU menggunakan times (). getrusage () jauh lebih tepat karena resolusi mikrodetik.

Anda dapat melihat centiseconds dengan contoh berikut ( lihat baris 5 output ):

% /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

Lebih banyak resolusi dapat diperoleh dengan menggunakan timeperintah bash seperti itu & Anda dapat mengontrol resolusi:

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

Dari manual Bash pada variabel :

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.
slm
sumber
ya saya sudah tahu semua itu. Jadi saya dapat menyimpulkan bahwa apa yang saya inginkan tidak mungkin? Apakah ada cara untuk menggunakan versi waktu bash dan hanya mendapatkan waktu detik nyata dengan 3 digit?
Flame_Phoenix
Lihat pembaruan saya, Anda dapat mengontrol perintah waktu bash menggunakan variabel TIMEFORMAT. Apakah itu yang Anda cari?
slm
Yah, itu dia, terima kasih! Saya bertanya-tanya, bagaimana cara menambahkannya ke file? Saya mencoba menggunakan% TIMEFORMAT = '% 3R'; waktu (tidur .22222) >> bla.txt tetapi tidak berfungsi: S Anyway, dipilih. Saya berharap saya bisa memberi Anda karma ++, tapi saya tidak punya 15 karma -.- '
Flame_Phoenix
2
TIMEFORMAT = '% 3R'; waktu (tidur .22222) 2 >> myFile.txt GOT it!
Flame_Phoenix
Pengguna lama keduanya dan tidak tahu TIMEFORMAT, saya selalu menggunakan sed untuk mengekstrak real time. Terima kasih! "Karena resolusi mikrodetik." pernyataan menaruh harapan saya yang TIMEFORMAT=%6Rakan berhasil tetapi tampaknya bahwa angka presisi mungkin hanya 0-3.
mxmlnkn