Tăng độ chính xác% e với lệnh / usr / bin / time shell


19

Khi tôi chạy lệnh time in shell, time ./myapptôi nhận được một đầu ra như sau:

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

Tuy nhiên, khi tôi chạy lệnh, \time -f %e ./myapptôi mất độ chính xác và tôi nhận được:

2.01s

Nếu tôi sử dụng %Elệnh tôi cũng mất độ chính xác theo cách tương tự. Làm cách nào để thay đổi nó để có độ chính xác cao hơn một lần nữa, nhưng vẫn chỉ có các giây được xuất ra?

Tôi dựa trên nghiên cứu của mình trong Lệnh Linux / Unix này: thời giancâu hỏi này

Câu trả lời:


21

Tôi giả sử bạn hiểu rằng cả hai lệnh này đang gọi một phiên bản thời gian khác nhau, phải không?

phiên bản tích hợp của bash

% time

GNU thời gian aka. / usr / thùng / lần

% \time

Việc xây dựng trong timelệnh để bashcó thể được đọc lên trên đây:

% 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/timethường hữu ích hơn so với tích hợp sẵn.

Đối với vấn đề chính xác của bạn, nó được đề cập ở đây trong ý chính của github này , cụ thể:

Tại sao thời gian bash chính xác hơn thời gian GNU?

Thời gian lệnh bash dựng sẵn cho độ chính xác của milisecond khi thực thi và thời gian GNU (thường là / usr / bin / time) cho độ chính xác đến từng phần trăm giây. Thời gian (2) tòa nhà cho thời gian trong đồng hồ và 100 đồng hồ = 1 giây (thông thường), do đó độ chính xác giống như thời gian GNU. Thời gian bash sử dụng là gì để nó chính xác hơn?

Thời gian Bash sử dụng nội bộ getrusage () và thời gian GNU sử dụng lần (). getrusage () chính xác hơn nhiều vì độ phân giải micro giây.

Bạn có thể xem phần trăm giây với ví dụ sau ( xem dòng đầu ra thứ 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

Có thể có nhiều độ phân giải hơn bằng cách sử dụng timelệnh của bash như vậy & bạn có thể kiểm soát độ phân giải:

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

Từ hướng dẫn Bash về các biến :

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.

vâng tôi đã biết tất cả về điều đó. Vì vậy, tôi có thể kết luận rằng những gì tôi muốn là không thể? Có cách nào để sử dụng phiên bản bash time và chỉ nhận được thời gian giây thực sự với 3 chữ số không?
Flame_Phoenix

Xem cập nhật của tôi, bạn có thể kiểm soát lệnh thời gian của bash bằng biến TIMEFORMAT. Có phải đó là những gì bạn đang tìm kiếm?
slm

Yah, đó là nó, cảm ơn! Mặc dù vậy, tôi tự hỏi, làm thế nào để tôi thêm nó vào một tập tin? Tôi đang cố gắng sử dụng% TIMEFORMAT = '% 3R'; thời gian (ngủ .22222) >> bla.txt nhưng nó không hoạt động: S Dù sao, đã chọn. Tôi ước tôi có thể ban cho bạn nghiệp chướng ++, nhưng tôi không có 15 nghiệp chướng
.-

2
TIMEFORMAT = '% 3R'; thời gian (ngủ .22222) 2 >> myFile.txt ĐI nó!
Flame_Phoenix

Người dùng lâu năm của cả hai và không biết gì TIMEFORMAT, tôi luôn sử dụng sed để trích xuất thời gian thực. Cảm ơn! "Vì độ phân giải micro giây." tuyên bố đặt hy vọng của tôi TIMEFORMAT=%6Rsẽ làm việc nhưng có vẻ như chữ số chính xác có thể chỉ là 0-3.
mxmlnkn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.