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.