Mac OS X altında Bash yürütme süresini milisaniye olarak nasıl alabilirim?


12

Ben kontrol ettim bu , ancak sağlanan çözüm benim için çalış yoktu.

Tarihi kullanarak saniyeler içinde yürütme süresini alabilirim:

T="$(date +%s)"
#some work here
T="$(($(date +%s)-T))"
echo "execution time (secs) ${T}"

Ancak, bunu denediğimde:

T="$(date +%s%N)"
#some work here
T="$(($(date +%s%N)-T))"

Nano saniye hassasiyetini elde etmek için% N (yukarıdaki gibi) ekleyerek aşağıdaki hatayı alıyorum: -bash: 1369320760N: taban için çok büyük bir değer (hata belirteci "1369320760N")

Mac OS X altında bash kullanarak yürütme süresini milisaniye cinsinden nasıl ölçeceğini bilen var mı?


Gerçekten nano ikinci çözünürlüğe mi ihtiyacınız var? Bu yaklaşıma çok fazla yükünüz var. İle # some work heresıfır olması gereken (ya da en azından sabit), hedefe ulaşmak için - ommited, ben 0,2 ila 0,3 saniye kez olsun. Halbuki /usr/bin/time usleep 500000,05 +/- 0,01 sn'lik bir makul kararlı zaman verir. (Yalnızca Linux'ta test edilmiştir, OSX'de / usr / bin / time ve / veya usleep'ın mevcut olup olmadığını bilmiyorum.)
mpy

Dahili saat çözünürlüğünün nano saniye seviyesine DOĞRU çözünürlük sunduğundan emin misiniz?
mdpc

Yanıtlar:


14

OSX bir BSD-ish sistemi olduğundan, strftime kütüphanesinin sahip olmadığı %N( http://www.freebsd.org/cgi/man.cgi?query=date )

Bash yerleşik timekomutu size ihtiyacınız olan bilgiyi veriyor mu?

time some work here

2
açıklığa kavuştuğunuz için teşekkürler, zaman mükemmel çalışıyor ve üç sonuç veriyor, ancak özellikle ilk ve son zamanlarla çalışmam gerekiyor.
pacodelumberg

11

Milisaniyeye ihtiyacım olsaydı ve BSD tarihi desteklemiyorsa bu rotaya giderdim +%s%N

perl -MTime::HiRes -e 'printf("%.0f\n",Time::HiRes::time()*1000)'

Teşekkürler!!! Kimsenin rapor etmediği bir çözüm ...
Daniele B

3

echo $(($(date +%s%N)/1000000))

Bu nano-saniyeden milli-saniyeye dönüşecektir.

@Mpy, date +%s.%Nçalışır.

Çıktı linux ve OS X arasında farklı olsa da:
linux: 1369322592.573787111
OS X:1369322610.N


Aşağıdaki hatayı alıyorum: -bash: 1369321446N: taban için çok büyük bir değer (hata belirteci "1369321446N") bu mac osx çalışmıyor, alıyorum:
pacodelumberg 23:03

Eh, o sinir bozucu ... Aynı hatayı görüyor (yanlış pencerede üzerinde test): /
ağırbaşlı

1
Çıktıyı bölmeye gerek yok, sadece kullanın date +%s.%N(ancak OSX'i kontrol edemiyorum; Linux üzerinde çalışıyor). Ama sorun o zaman yani, bashbireyin $(( ))IMHO kayan nokta sayıları işlemek mümkün değildir.
mpy

@mpy Bu osx üzerinde çalışır. İlk 10 karakter için aynı, linux ve OS X arasında farklı davranıyor.
çekingen

Bu, nano ikinci bilgileri tarih kullanarak alamayacağımız anlamına mı geliyor?
pacodelumberg

3

Eğer yüklerseniz coreutilsGNU Linux kullanabilirsiniz dateyazılı tarafından gdate.

coreutils Homebrew ile mevcuttur: brew install coreutils.


1

Diğer yanıtın belirttiği gibi, OS X'in tarihi% N'yi (nanosaniye) desteklemiyor.

Komutları zamana komut dosyası olarak kaydedebilir misiniz? Veya onlar için bir alt kabuk veya komut grubu kullanın:

time (sleep 0.1; echo a; sleep 0.1)
time { sleep 0.1; echo a; sleep 0.1; }

Veya tek tek komutların zamanlarını toplayın:

$ time=$(TIMEFORMAT=%R; (time sleep 0.1; echo a) 2>&1 > /dev/null)
$ time+=+$(TIMEFORMAT=%R; (time sleep 0.1) 2>&1)
$ bc <<< $time
.206

Veya bir komut dosyası dili kullanın:

$ ruby -e 'puts "%.3f" % Time.now'
1369329611.046
$ time ruby -e '""'
0.029
$ time ruby -e 'puts "%.3f" % Time.now'
1369329622.943
0.029

%.3f3 ondalık basamaklı bir kayan nokta sayısı için bir format belirleyicidir. Time.now , Time sınıfının bir sınıf yöntemidir.


Cevabınız için teşekkürler, lütfen yukarıdaki yakut kodunu açıklar mısınız?
pacodelumberg

1
In ruby -e 'puts "%.3f" % Time.now', rubyruby yorumlayıcısını çağırır -e, komut satırında aşağıdaki komut dosyasını çalıştırır. putsyakut printf(bir çeşit), Timeyakut bir obje ve Time.nowçağdan bu yana geçen saniye. Kullanımı %.3f, çıktıyı milisaniye (çıkışın ".046" ve ".943" kısımları) olan 3 ondalık basamağa keser
Olie

1
Ayrıca, timeaşağıdaki komutu çalıştırmanın ne kadar süreceğini belirten bir komut satırı aracıdır. Daha man timefazla bilgi için bakınız.
Olie

1

Glenn haklı, timearadığınız komut, ancak istediğiniz bilgiyi ayrıştırmak için, bunu gibi başka bir işlemciye iletmeniz gerekecek sed.

time command-goes-here >/dev/null 2>$1|sed rules-go-here

Bu komut, komutun kendisinden çıktıdan kurtulur (hem standart hem de hata çıktılarını / dev / null'a gönderir) ve zaman sonuçlarını sed'e geçirir; burada akışı düzenlemek için uygun kuralları seçmeniz gerekir ve çıktı istenen değer.

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.