11

Я проверил это, но предоставленное решение не сработало для меня.

Используя дату, я могу получить время выполнения в секундах:

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?

6 ответов6

13

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

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

time some work here
8

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

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

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

Это будет конвертировать из нано-секунд в миллисекунды.

От @mpy, date +%s.%N работает.

Вывод отличается между Linux и OS X, хотя:
Linux: 1369322592.573787111
OS X: 1369322610.N

1

Гленн прав, time - это команда, которую вы ищете, но для того, чтобы разобрать нужную вам информацию, вам нужно будет передать ее другому процессору, например, sed .

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

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

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.

1

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .