Как получить время выполнения 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?

pacodelumberg
источник
Вам действительно нужно нано второе разрешение? Какой такой подход у вас много накладных расходов. С # some work hereопущенным, я получаю время от 0,2 до 0,3 сек - что должно быть ноль (или, по крайней мере, постоянным), чтобы достичь вашей цели. Принимая во внимание, /usr/bin/time usleep 50000что разумное стабильное время составляет 0,05 +/- 0,01 сек. (Проверено только в Linux, не знаю, доступны ли / OSR / bin / time и / или usleep для OSX.)
mpy
Вы уверены, что разрешение внутренних часов обеспечивает точное разрешение вплоть до наносекундного уровня?
mdpc

Ответы:

13

Поскольку OSX является системой BSD-ish, ее библиотека strftime не имеет %N( http://www.freebsd.org/cgi/man.cgi?query=date )

timeПредоставляет ли встроенная команда bash необходимую вам информацию?

time some work here
Гленн Джекман
источник
2
спасибо за разъяснение, время работает отлично и выдает три результата, но мне нужно специально работать с начальным и конечным временем.
pacodelumberg
8

Я бы пошел по этому пути, если бы мне понадобились миллисекунды, а BSD не поддерживал дату +%s%N

perl -MTime::HiRes -e 'printf("%.0f\n",Time::HiRes::time()*1000)'
hpavc
источник
Спасибо!!! Это то решение, о котором никто не сообщал ...
Даниэле Б
2

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
2

Если вы устанавливаете, coreutilsвы можете использовать GNU Linux date, написав gdate.

Coreutils доступен с Homebrew: brew install coreutils.

youyoup
источник
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.

LRI
источник
Спасибо за ваш ответ, не могли бы вы описать код рубина выше?
pacodelumberg
1
В ruby -e 'puts "%.3f" % Time.now', rubyвызывает интерпретатор ruby, -eвыполняет сценарий, который следует в командной строке. putsявляется ruby's printf(своего рода), Timeявляется объектом ruby ​​и 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, где вам нужно будет выбрать соответствующие правила для редактирования потока, и вывести желаемое значение.

Зак Мельник
источник