Bagaimana cara mendapatkan waktu eksekusi Bash dalam milidetik di bawah Mac OS X?

12

Saya sudah memeriksa ini , tetapi solusi yang diberikan tidak bekerja untuk saya.

Menggunakan tanggal saya bisa mendapatkan waktu eksekusi dalam hitungan detik:

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

Namun, ketika saya mencoba ini:

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

Menambahkan% N (seperti di atas) ke tanggal untuk mendapatkan ketepatan nano-detik saya mendapatkan kesalahan berikut: -bash: 1369320760N: nilai terlalu besar untuk basis (token kesalahan adalah "1369320760N")

Adakah yang tahu cara mengukur waktu eksekusi dalam milidetik menggunakan bash di bawah Mac OS X?

pacodelumberg
sumber
Apakah Anda benar-benar membutuhkan resolusi nano kedua? Yang mana pendekatan ini memiliki banyak overhead. Dengan # some work hereommited, saya mendapatkan waktu dari 0,2 hingga 0,3 detik - apa yang seharusnya nol (atau setidaknya konstan) untuk mencapai tujuan Anda. Sedangkan /usr/bin/time usleep 50000waktu stabil reasonale 0,05 +/- 0,01 detik. (Hanya diuji di Linux, tidak tahu apakah / usr / bin / waktu dan / atau usleep tersedia di OSX.)
mpy
Apakah Anda yakin resolusi jam internal menawarkan resolusi ACCURATE ke tingkat nano-detik?
mdpc

Jawaban:

14

Karena OSX adalah sistem BSD-ish, itu perpustakaan strftime tidak memiliki %N( http://www.freebsd.org/cgi/man.cgi?query=date )

Apakah perintah bash builtin timememberi Anda informasi yang Anda butuhkan?

time some work here
glenn jackman
sumber
2
terima kasih telah menjelaskannya, waktu bekerja dengan sempurna dan menghasilkan tiga hasil, tetapi saya perlu secara khusus bekerja dengan waktu awal dan akhir.
pacodelumberg
11

Saya akan pergi rute ini jika saya membutuhkan milidetik dan BSD tidak mendukung tanggal +%s%N

perl -MTime::HiRes -e 'printf("%.0f\n",Time::HiRes::time()*1000)'
hpavc
sumber
Terima kasih!!! Itulah solusi yang tidak dilaporkan siapa pun di sekitar ...
Daniele B
3

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

Ini akan mengkonversi dari nano-detik ke mili-detik.

Dari @mpy, date +%s.%Nbekerja.

Output berbeda antara linux dan OS X:
linux: 1369322592.573787111
OS X:1369322610.N

pendiam
sumber
Saya mendapatkan kesalahan berikut: -bash: 1369321446N: nilai terlalu besar untuk basis (token kesalahan adalah "1369321446N") ini tidak berfungsi di mac osx, saya mendapatkan:
pacodelumberg
Yah, itu menjengkelkan ... (diuji pada jendela yang salah) melihat kesalahan yang sama: /
demure
1
Tidak perlu membagi output, cukup gunakan date +%s.%N(tapi saya tidak dapat memeriksa OSX; ini bekerja di Linux). Tapi masalahnya kemudian adalah, bahwa bash's $(( ))IMHO tidak mampu menangani angka floating point.
mpy
@ mpy Itu berfungsi di osx. Sama untuk 10 karakter pertama, bertindak berbeda antara linux dan OS X.
sopan
Apakah itu berarti kita tidak bisa mendapatkan informasi nano kedua menggunakan tanggal?
pacodelumberg
3

Jika Anda menginstal, coreutilsAnda dapat menggunakan GNU Linux datedengan menulis gdate.

coreutils tersedia dengan Homebrew: brew install coreutils.

kamuyup
sumber
1

Seperti jawaban lain yang disebutkan, tanggal OS X tidak mendukung% N (nanodetik).

Bisakah Anda menyimpan perintah ke waktu sebagai skrip? Atau gunakan subkulit atau grup perintah untuk mereka:

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

Atau jumlah waktu dari masing-masing perintah:

$ 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

Atau gunakan beberapa bahasa skrip:

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

%.3fadalah penentu format untuk angka floating point dengan 3 angka desimal. Time.now adalah metode kelas dari kelas Time.

Lri
sumber
Terima kasih atas jawaban Anda, bisakah Anda jelaskan kode ruby ​​di atas?
pacodelumberg
1
Di ruby -e 'puts "%.3f" % Time.now', rubypanggil juru ruby, -ejalankan skrip yang mengikuti pada baris perintah. putsadalah ruby printf(semacam), Timeadalah objek ruby ​​dan Time.nowmerupakan detik sejak zaman. Menggunakan %.3ftrim output ke 3 tempat desimal, yaitu milidetik (bagian ".046" dan ".943" dari output.)
Olie
1
Juga, timeadalah alat baris perintah yang kali berapa lama untuk menjalankan perintah yang mengikuti. Lihat man timeuntuk lebih jelasnya.
Olie
1

Glenn benar, timeadalah perintah yang Anda cari, tetapi untuk mengurai info yang Anda inginkan, Anda harus meneruskannya ke beberapa prosesor lain seperti sed.

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

Perintah ini akan menghilangkan output dari perintah itu sendiri (mengirimkan output standar dan kesalahan ke / dev / null), dan meneruskan hasil waktu ke sed, di mana Anda akan perlu memilih aturan yang sesuai untuk mengedit aliran, dan output nilai yang diinginkan.

Zach Melnick
sumber