/ Usr / bin / time shell komutuyla% e hassasiyetini artırın


19

Kabukta zaman komutunu çalıştırdığımda time ./myappaşağıdaki gibi bir çıktı alıyorum:

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

Ancak, komutu çalıştırdığımda \time -f %e ./myapphassasiyeti kaybederim ve şunu elde ederim:

2.01s

%EKomutu kullanırsam aynı şekilde hassasiyeti de kaybederim. Tekrar daha fazla kesinlik elde etmek için nasıl değiştirebilirim, ancak yine de yalnızca saniyeler çıkarılır?

Araştırmamı bu Linux / Unix Komutuna dayandım: zaman ve bu soru üzerine

Yanıtlar:


21

Bu komutların her ikisinin de farklı bir zaman sürümünü çağırdığını anladığınızı varsayıyorum, değil mi?

bash'ın yerleşik sürümü

% time

GNU zamanı aka. / Usr / bin / zaman

% \time

Yerleşik timekomut bashburada okunabilir:

% 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/timegenellikle yerleşik olandan daha kullanışlıdır.

Kesinlik probleminize gelince, bu github özünde burada ele alınmaktadır , özellikle:

Bash zamanı neden GNU zamanından daha hassas?

Yerleşik bash komut süresi milisaniyelik yürütme hassasiyeti sağlar ve GNU süresi (genellikle / usr / bin / time) santisaniye hassasiyet verir. Zaman (2) sistem çağrısı saat cinsinden zaman verir ve 100 saat = 1 saniye (genellikle), böylece hassasiyet GNU süresine benzer. Daha kesin olması için bash zamanı nedir?

Bash zamanı dahili olarak getrusage (), GNU zamanı ise times () kullanır. getrusage () mikrosaniye çözünürlüğü nedeniyle çok daha hassastır.

Aşağıdaki örnekle santimetreyi görebilirsiniz ( 5. çıkış satırına bakın) ):

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

Bash kullanarak daha fazla çözünürlük elde edilebilir time komutunu ve çözünürlüğü kontrol edebilirsiniz:

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

Değişkenlerle ilgili Bash kılavuzundan :

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.

evet zaten hepsini biliyordum. Yani istediğim şeyin imkansız olduğu sonucuna varabilir miyim? Bash zaman sürümünü kullanmanın ve sadece 3 saniyelik gerçek saniye süresini elde etmenin bir yolu var mı?
Flame_Phoenix

Güncellememe bakın, TIMEFORMAT değişkenini kullanarak bash'ın zaman komutunu kontrol edebilirsiniz. Aradığın şey bu mu?
slm

Yah, hepsi bu, teşekkürler! Yine de merak ediyorum, bunu bir dosyaya nasıl ekleyebilirim? % TIMEFORMAT = '% 3R' kullanmaya çalışıyorum; time (sleep .22222) >> bla.txt ama çalışmıyor: S Neyse, seçilmiş. Keşke sana karma ++ verebilirim, ama 15
karma'ım yok.

2
TIMEFORMAT = '% 3R'; süresi (uyku .22222) 2 >> myFile.txt GOt!
Flame_Phoenix

Her ikisi de uzun süre kullanıcı ve bilmiyordum TIMEFORMAT, her zaman sed gerçek zamanlı ayıklamak için kullanılır. Teşekkürler! "Mikrosaniye çözünürlüğü nedeniyle." ifadesi TIMEFORMAT=%6Rişe yarayacak umutlarımı ortaya koydu, ancak hassas basamak sadece 0-3 olabilir gibi görünüyor.
mxmlnkn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.