เพิ่มความแม่นยำ% e ด้วยคำสั่ง / usr / bin / time


19

เมื่อฉันรันคำสั่ง time ใน shell 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คำสั่งในตัวที่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.

แอฟริกาtime, /usr/bin/timeมักจะมีประโยชน์มากกว่าในตัว

สำหรับปัญหาความแม่นยำของคุณมันครอบคลุมในส่วนนี้git githubโดยเฉพาะ:

เหตุใดเวลาทุบตีจึงแม่นยำมากขึ้นตามเวลา GNU

เวลาคำสั่ง builtin bash ให้ความแม่นยำในการประมวลผลเป็นมิลลิวินาทีและเวลา GNU (โดยปกติ / usr / bin / time) ให้ความแม่นยำเป็นมิลลิวินาที เวลา (2) syscall ให้เวลาในนาฬิกาและ 100 นาฬิกา = 1 วินาที (ปกติ) ดังนั้นความแม่นยำจึงเหมือนเวลาของ GNU ใช้เวลาทุบตีอะไรเพื่อให้แม่นยำยิ่งขึ้น

เวลา Bash ภายในใช้ getrusage () และเวลา GNU ใช้เวลา () 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 time หรือไม่และรับเวลาจริงเพียง 3 วินาทีเท่านั้นหรือไม่
Flame_Phoenix

ดูการปรับปรุงของฉันคุณสามารถควบคุมคำสั่งเวลาของ bash โดยใช้ตัวแปร TIMEFORMAT นั่นคือสิ่งที่คุณกำลังมองหา?
slm

ขอขอบคุณ! ฉันสงสัยว่าฉันจะผนวกมันเข้ากับไฟล์ได้อย่างไร? ฉันพยายามใช้% TIMEFORMAT = '% 3R'; เวลา (sleep .22222) >> bla.txt แต่มันใช้งานไม่ได้: S อย่างไรก็ตามเลือกแล้ว ฉันหวังว่าฉันจะให้กรรม ++ แก่คุณ แต่ฉันไม่มี 15 กรรม
--.-

2
TIMEFORMAT = '% 3R'; เวลา (sleep .22222) 2 >> myFile.txt ไปเลย!
Flame_Phoenix

ผู้ใช้ทั้งคู่มาเป็นเวลานานและไม่รู้เรื่องTIMEFORMATฉันมักใช้ sed เพื่อแยกเวลาจริง ขอบคุณ! "เนื่องจากความละเอียดระดับไมโครวินาที" คำสั่งทำให้ความหวังของฉันที่TIMEFORMAT=%6Rจะทำงาน แต่ดูเหมือนว่าตัวเลขที่แม่นยำอาจเป็นเพียง 0-3
mxmlnkn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.