Sprawdziłem to , ale dostarczone rozwiązanie nie działało dla mnie.
Za pomocą daty mogę uzyskać czas wykonania w sekundach:
T="$(date +%s)"
#some work here
T="$(($(date +%s)-T))"
echo "execution time (secs) ${T}"
Jednak gdy spróbuję:
T="$(date +%s%N)"
#some work here
T="$(($(date +%s%N)-T))"
Dodając% N (jak wyżej) do daty, aby uzyskać precyzję w sekundach, otrzymuję następujący błąd: -bash: 1369320760N: wartość zbyt duża dla podstawy (token błędu to „1369320760N”)
Czy ktoś wie, jak mierzyć czas wykonywania w milisekundach przy użyciu bash w systemie Mac OS X?
# some work here
trybu wspólnego otrzymuję czasy od 0,2 do 0,3 sekundy - co powinno wynosić zero (lub przynajmniej stałą), aby osiągnąć cel. Natomiast/usr/bin/time usleep 50000
daje uzasadniony czas stabilny 0,05 +/- 0,01 sek. (Testowane tylko w systemie Linux, nie wiem, czy / OSR / bin / time i / lub usleep jest dostępny w OSX.)Odpowiedzi:
Ponieważ OSX jest systemem BSD, jego biblioteka strftime nie ma
%N
( http://www.freebsd.org/cgi/man.cgi?query=date )Czy wbudowane
time
polecenie bash dostarcza potrzebnych informacji?źródło
Wybrałbym tę trasę, gdybym potrzebował milisekund, a BSD nie obsługiwał daty
+%s%N
źródło
echo $(($(date +%s%N)/1000000))
To przekształciłoby się z nano sekund do milisekund.Z @mpy
date +%s.%N
działa.Wyjście różni się jednak między linuksem a OS X:
linux:
1369322592.573787111
OS X:
1369322610.N
źródło
date +%s.%N
(ale nie mogę sprawdzić OSX; działa na Linuksie). Ale problem jest wtedy, żebash
„s$(( ))
IMHO nie jest w stanie obsłużyć liczb zmiennoprzecinkowych.Jeśli zainstalujesz
coreutils
, możesz użyć GNU Linuxdate
piszącgdate
.coreutils jest dostępny z Homebrew:
brew install coreutils
.źródło
Jak wspomniano w innej odpowiedzi, data OS X nie obsługuje% N (nanosekund).
Czy możesz po prostu zapisać polecenia jako czas? Lub użyj dla nich podpowłoki lub grupy poleceń:
Lub zsumuj czasy poszczególnych poleceń:
Lub użyj jakiegoś języka skryptowego:
%.3f
jest specyfikatorem formatu dla liczby zmiennoprzecinkowej z 3 miejscami po przecinku. Time.now to metoda klasowa klasy Time.źródło
ruby -e 'puts "%.3f" % Time.now'
,ruby
wywołuje interpreter ruby,-e
wykonuje skrypt następujący w wierszu poleceń.puts
jest rubyprintf
(w pewnym sensie),Time
jest rubinowym przedmiotem iTime.now
jest sekundą od epoki. Użycie%.3f
przycina dane wyjściowe do 3 miejsc po przecinku, czyli w milisekundach (części „.046” i „.943” danych wyjściowych).time
jest narzędziem wiersza polecenia, które mierzy czas potrzebny do uruchomienia następującego polecenia. Zobaczman time
po więcej szczegółów.Glenn ma rację,
time
to polecenie, którego szukasz, ale aby przeanalizować potrzebne informacje, musisz przekazać je do innego procesora, takiego jaksed
.time command-goes-here >/dev/null 2>$1|sed rules-go-here
To polecenie pozbywa się danych wyjściowych z samego polecenia (wysyłając zarówno dane wyjściowe standardowe, jak i dane błędu do / dev / null) i przekazuje wyniki czasowe do sed, gdzie będziesz musiał wybrać odpowiednie reguły, aby edytować strumień i dane wyjściowe żądana wartość.
źródło