/usr/bin/time --формат вывода прошедшего времени в миллисекундах

Я использую программу /usr/bin/time для измерения времени выполнения команды. с параметром --format я могу отформатировать вывод. например

/usr/bin/time -f "%e" ls

есть ли способ вывести большую точность прошедших секунд? или просто выводить миллисекунды, а не секунды?

В руководстве по /usr/bin/time говорится только о секундах, но, возможно, есть способ, и кто-то может мне помочь... спасибо!

EDIT: я знаю о команде bash «time», которая использует формат переменной среды «TIMEFORMAT». извините, но я не хочу менять этот env-var... мне это кажется рискованным, решение должно быть чем-то, что вообще не меняет работающую систему :)


person Preexo    schedule 06.06.2013    source источник
comment
На справочной странице об этом ничего не сказано. Поэтому я предполагаю, что невозможно использовать неизменную версию времени. Должна быть возможность создать патч для выходного формата, но я не знаю, можно ли получить более высокую точность.   -  person hek2mgl    schedule 06.06.2013
comment
Просто указываю будущим читателям, что переменная TIMEFORMAT только используется для управления выводом встроенной команды time. Там нет никакого риска, связанного с его изменением.   -  person David Z    schedule 15.10.2014
comment
Также изменения в оболочке влияют только на эту оболочку.   -  person studog    schedule 04.06.2018


Ответы (3)


Одна из возможностей — использовать команду date:

ts=$(date +%s%N) ; my_command ; tt=$((($(date +%s%N) - $ts)/1000000)) ; echo "Time taken: $tt milliseconds"

%N должен возвращать наносекунды и 1 миллисекунду. составляет 1000000 наносекунд, поэтому при делении будет возвращено время, затраченное на выполнение my_command в миллисекундах.

ПРИМЕЧАНИЕ, что %N поддерживается не во всех системах, но в большинстве из них.

person devnull    schedule 06.06.2013
comment
отлично, принято! не думал о дате, но это достаточно хорошо! Однако, чтобы перейти от наносекунд к миллисекундам, вам нужно разделить на 1000000: ts=$(date +%s%N) ; спать 1 ; tt=$((($(дата +%s%N) - $ts)/1000000)) ; эхо $tt - person Preexo; 06.06.2013
comment
Для тех, кто работает в OSX без требуемого временного разрешения от даты, можно заменить собственную дату на gdate. Например: brew install coreutils при необходимости, а затем ts=$(gdate +%s%N) ; sleep 1 ; tt=$((($(gdate +%s%N) - $ts)/1000000)) ; echo $tt источник - person snodnipper; 06.10.2016
comment
Вы можете использовать %3N в системах с %N, чтобы получить только миллисекунды. См. https://serverfault.com/a/588705/432437 - person studog; 05.06.2018

Для удобства я превратил ответ devnull в скрипт (я назвал его миллисекундным).

#!/bin/bash
ts=$(date +%s%N) ; $@ ; tt=$((($(date +%s%N) - $ts)/1000000)) ; echo "Time taken: $tt milliseconds"

Я поместил скрипт в /usr/local/bin.
Дал ему права на выполнение chmod +x /usr/local/bin/millisecond-time.
Теперь я могу использовать его так: millisecond-time my_command

P.S. Это был бы комментарий, если бы у меня был представитель».

person Infineight    schedule 23.01.2017
comment
Чтобы разрешить my_command иметь аргументы, вы можете заключить предоставленную команду в кавычки: "$@" - person Yuriy Nemtsov; 09.01.2019

В этой ветке есть пара вещей, которые путают.

В Bash есть встроенная команда time, которая поддерживает переменную среды TIMEFORMAT, позволяющую форматировать вывод. Для получения подробной информации об этом запустите man bash и найдите TIMEFORMAT.

Существует также стандартная утилита командной строки /usr/bin/time, которая поддерживает переменную среды TIME, позволяющую форматировать вывод (или вы можете использовать -f или --format в командной строке). Для получения подробной информации об этом запустите man time и найдите TIME.

Если вам нужно количество секунд, которое потребовалось для запуска команды, вы можете использовать встроенную команду bash (которая поддерживает максимальную точность до трех знаков после запятой):

bash# export TIMEFORMAT="%3lR" 
bash# time find /etc > /dev/null
0m0.015s

Или вы можете использовать утилиту командной строки (которая поддерживает максимальную точность до двух знаков после запятой):

shell# export TIME="%E"
shell# /usr/bin/time find /opt/ > /dev/null
0:00.72

Как упоминалось выше, ни одна из этих переменных не используется ничем другим, и их изменение безопасно.

person Adam Shand    schedule 08.01.2021