Я хочу сделать bash-скрипт, который измеряет время запуска браузера, для этого я использую HTML, который получает метку времени при загрузке в миллисекундах с помощью JavaScript.
В сценарии оболочки перед вызовом браузера я получаю метку времени:
date +%s
Проблема в том, что он получает отметку времени в секундах, а мне она нужна в миллисекундах, поскольку иногда при повторном запуске браузер запускается менее чем за секунду, и мне нужно иметь возможность точно измерить это время, используя миллисекунды вместо секунд.
Как я могу получить метку времени в миллисекундах из скрипта bash?
источник
$(($(date +'%s * 1000 + %N / 1000000')))
. Это все еще не имеет большого смысла, но будет более надежным.%N
недоступно в BSD и OS X.echo $(( $(date '+%s%N') / 1000000))
?С реализацией GNU или ast-open
date
(или busybox ', если она собрана сFEATURE_DATE_NANO
включенной опцией), я бы использовал:который возвращает миллисекунды с эпохи Unix.
источник
%3N
выполняет ли необходимое заполнение нулями слева (не читая документы. ;-), вы можете сделатьwhile sleep 0.05; do date +%s%3N; done
, и да, там есть необходимые нули.%3N
это действительно ноль. Кроме того, я не думаю, что ваше решение добавит нули, просто немного задержит ответ.%3N
он действительно дополнен нулями.В случае, если кто-то использует другие оболочки, кроме
bash
,ksh93
иzsh
имеет$SECONDS
переменную с плавающей запятой, если вы делаете a,typeset -F SECONDS
что может быть удобно для измерения времени с точностью:Начиная с версии 4.3.13 (2011) в модуле
zsh
есть$EPOCHREALTIME
специальная переменная с плавающей точкойzsh/datetime
:Обратите внимание, что это происходит от двух целых чисел (для секунд и наносекунд), возвращаемых
clock_gettime()
. В большинстве систем это больше точности, чемdouble
может удерживать одно число с плавающей запятой C , поэтому вы потеряете точность, если будете использовать его в арифметических выражениях (за исключением дат в первые несколько месяцев 1970 года).Чтобы вычислить разницу во времени с высокой точностью (хотя я сомневаюсь, что вам потребуется точность с точностью до миллисекунды), вы можете
$epochtime
вместо этого использовать специальный массив (который содержит секунды и наносекунды в качестве двух отдельных элементов).Начиная с версии 5.7 (2018)
strftime
встроенная оболочка также поддерживает%N
наносекундный формат, например, GNUdate
и a,%.
для указания точности, поэтому число миллисекунд с начала эпохи также можно получить с помощью:(или хранится в переменной с помощью
-s var
)источник
Чтобы избежать вычислений для получения миллисекунд, интерпретаторы JavaScript командной строки могут помочь:
Пакеты, содержащие этих переводчиков в Ubuntu Eoan:
источник
В Баш 5+ есть переменная с микро-второй зернистости:
$EPOCHREALTIME
.Так:
Печатает время с эпохи (1/1/70) в миллисекундах.
В противном случае вы должны использовать дату. Либо дата GNU:
Одна из альтернатив, перечисленных в https://serverfault.com/a/423642/465827
Или
brew install coreutils
для OS XИли, если ничего не помогает, скомпилируйте (gcc epochInµsec.c) эту программу c (при необходимости измените):
Обратите внимание, что вызов любой внешней программы требует времени для чтения и загрузки с диска, запуска, запуска и, наконец, для вывода на печать. Это займет несколько миллисекунд. Это минимальная точность, которую можно достичь с помощью любого внешнего инструмента (включая дату).
источник