Chcę zrobić skrypt bash, który mierzy czas uruchamiania przeglądarki, dlatego używam html, który pobiera znacznik czasu w czasie ładowania w milisekundach za pomocą JavaScript.
W skrypcie powłoki tuż przed wywołaniem przeglądarki otrzymuję znacznik czasu z:
date +%s
Problem polega na tym, że znacznik czasu pobiera się w sekundach, a ja potrzebuję go w milisekundach, ponieważ czasami, gdy uruchamiany jest drugi raz, przeglądarka uruchamia się w mniej niż sekundę i muszę być w stanie dokładnie zmierzyć ten czas za pomocą milisekund zamiast sekund.
Jak mogę uzyskać znacznik czasu w milisekundach ze skryptu bash?
źródło
$(($(date +'%s * 1000 + %N / 1000000')))
. To nadal nie ma większego sensu, ale byłoby bardziej niezawodne.%N
nie jest dostępny w BSD i OS X.echo $(( $(date '+%s%N') / 1000000))
?Z implementacją GNU lub ast-open
date
(lub busybox ', jeśli został zbudowany zFEATURE_DATE_NANO
włączoną opcją), użyłbym:która zwraca milisekundy od epoki Uniksa.
źródło
%3N
, że wypełnia niezbędne lewe zero (bez czytania dokumentacji. ;-), możesz to zrobićwhile sleep 0.05; do date +%s%3N; done
i tak, niezbędne są zera.%3N
rzeczywiście jest wyściełany zerami. Co więcej, nie sądzę, aby twoje rozwiązanie dodawało zera, po prostu opóźniaj odpowiedź tak mało.%3N
rzeczywiście jest on wypełniony zerami.W przypadku, gdy ktoś używa innych niż muszle
bash
,ksh93
izsh
mają zmiennoprzecinkowe$SECONDS
zmienną jeśli zrobićtypeset -F SECONDS
, które mogą być przydatne do pomiaru czasu z dokładnością:Od wersji 4.3.13 (2011) w module
zsh
znajduje się$EPOCHREALTIME
specjalna zmienna zmiennoprzecinkowazsh/datetime
:Zauważ, że pochodzi od dwóch liczb całkowitych (dla sekund i nanosekund) zwróconych przez
clock_gettime()
. W większości systemów jest to większa precyzja, niżdouble
może pomieścić pojedyncza liczba zmiennoprzecinkowa C , więc stracisz precyzję, gdy użyjesz jej w wyrażeniach arytmetycznych (z wyjątkiem dat w pierwszych miesiącach 1970 r.).Aby obliczyć różnice czasowe o wysokiej precyzji (wątpię, byś potrzebował więcej niż milisekundowej precyzji), możesz
$epochtime
zamiast tego użyć specjalnej tablicy (która zawiera sekundy i nanosekundy jako dwa osobne elementy).Od wersji 5.7 (2018)
strftime
wbudowana powłoka obsługuje także%N
format nanosekundowy à la GNUdate
i a,%.
aby określić precyzję, więc liczbę milisekund od epoki można również odzyskać za pomocą:(lub przechowywane w zmiennej z
-s var
)źródło
Aby uniknąć obliczeń w celu uzyskania milisekund, interpretery JavaScript w wierszu poleceń mogą pomóc:
Pakiety zawierające tych tłumaczy na Ubuntu Eoan:
źródło
W bash 5+ istnieje zmienna o ziarnistości mikrosekundowej:
$EPOCHREALTIME
.Więc:
Drukuje czas od epoki (1/1/70) w milisekundach.
W przeciwnym razie musisz użyć daty. Albo data GNU:
Jedna z alternatyw wymienionych na https://serverfault.com/a/423642/465827
Lub
brew install coreutils
dla OS XLub, jeśli wszystko inne zawiedzie, skompiluj (gcc epochInµsec.c) ten program c (dostosuj w razie potrzeby):
Pamiętaj, że wywołanie dowolnego programu zewnętrznego wymaga czasu na odczyt i załadowanie z dysku, uruchomienie, uruchomienie i wreszcie wydrukowanie wyniku. To zajmie kilka milisekund. Jest to minimalna precyzja, którą można osiągnąć za pomocą dowolnego narzędzia zewnętrznego (w tym daty).
źródło