Як отримати час виконання Bash в мілісекундах під Mac OS X?


12

Я перевірив це , але надане рішення не працювало для мене.

Використовуючи дату, я можу отримати час виконання в секундах:

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

Однак коли я спробую це:

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

Додаючи% N (як вище) до дати отримання нано-другої точності, я отримую таку помилку: -bash: 1369320760N: значення занадто велике для бази (помилка помилки "1369320760N")

Хтось знає, як виміряти час виконання в мілісекундах, використовуючи bash під Mac OS X?


Вам дійсно потрібна наносерезолюція? Який у вас такий підхід у вас багато накладних. З # some work hereуміткою я отримую час від 0,2 до 0,3 сек. - що має бути нульовим (або принаймні постійним) для досягнення вашої мети. Тоді як /usr/bin/time usleep 50000дає досить стійкий час 0,05 +/- 0,01 сек. (Тестується лише в Linux, не знаю, чи / usr / bin / time та / або usleep доступний на OSX.)
mpy

Ви впевнені, що внутрішня роздільна здатність годинника пропонує ТОЧНУ роздільну здатність до нано-другого рівня?
mdpc

Відповіді:


14

Оскільки OSX - система BSD-ish, у бібліотеці стропінгу немає %N( http://www.freebsd.org/cgi/man.cgi?query=date )

Чи дає команда bash вбудована timeінформація, яка вам потрібна?

time some work here

2
дякую, що я зрозумів, що час ідеально працює і дає три результати, але мені потрібно спеціально працювати з початковим та останнім часом.
pacodelumberg

11

Я б пішов цим маршрутом, якщо мені знадобилися мілісекунди, і BSD не підтримував дату +%s%N

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

Спасибі!!! Це рішення, про яке ніхто не повідомляв ...
Daniele B

3

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

Це призвело б до перетворення з наносекунд на мілісекунд.

Від @mpy, date +%s.%Nпрацює.

Вихід відрізняється між Linux та OS X, хоча:
linux: 1369322592.573787111
OS X:1369322610.N


Я отримую таку помилку: -bash: 1369321446N: занадто велике значення для бази (маркер помилки "1369321446N") це не працює в mac osx, я отримую:
pacodelumberg

Ну, це дратує ... (перевірено на неправильному вікні), бачачи ту саму помилку: /
демур

1
Не потрібно ділити вихід, просто використовуйте date +%s.%N(але я не можу перевірити OSX; він працює на Linux). Але проблема то в тому, що bash«S $(( ))ИМХО НЕ в змозі впоратися з числами з плаваючою точкою.
mpy

@mpy Це працює на OSX. Те саме, що для перших 10 символів, діє по-різному між Linux та OS X, хоча.
деморе

Чи означає це, що ми не можемо отримати нано-другу інформацію, використовуючи дату?
pacodelumberg

3

Якщо ви встановите, coreutilsви можете використовувати GNU Linux date, написавши текст gdate.

Coreutils доступний з Homebrew: brew install coreutils.


1

Як було сказано в іншій відповіді, дата OS X не підтримує% N (наносекунд).

Чи можете ви просто зберегти команди як час як сценарій? Або використовуйте для них підкатегорію або командну групу:

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

Або підсумовуйте час окремих команд:

$ 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

Або скористайтеся якоюсь мовою сценарію:

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

%.3f- специфікатор формату для числа з плаваючою комою з 3 десятковими крапками. Time.now - класний метод класу Time.


Дякуємо за вашу відповідь, чи можете ви описати вище рубіновий код?
pacodelumberg

1
В ruby -e 'puts "%.3f" % Time.now', rubyвикликає інтерпретатора рубіну, -eвиконує сценарій, який слідує в командному рядку. putsє рубіновим printf(начебто), Timeє рубіновим об'єктом і Time.nowстановить секунди з епохи. Використання %.3fобрізає вихід на 3 знаки після коми, що становить мілісекунди (частини ".046" і ".943")
Olie

1
Крім того, timeце інструмент командного рядка, який в рази, скільки часу потрібно, щоб запустити наступну команду. Дивіться man timeдокладнішу інформацію.
Олі

1

Правий Гленн - timeце команда, яку ви шукаєте, але для розбору потрібної інформації вам потрібно буде передати її іншому типу процесора sed.

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

Ця команда позбудеться виводу з самої команди (надсилаючи як стандартні, так і вихідні помилки в / dev / null) та передасть результати часу в sed, де вам потрібно буде вибрати відповідні правила для редагування потоку та виведення бажане значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.