Chcę wykonać coś w powłoce linuksowej w kilku różnych warunkach i móc wyprowadzić czas wykonania każdego wykonania.
Wiem, że mógłbym napisać skrypt Perla lub Pythona, który by to zrobił, ale czy istnieje sposób, aby to zrobić w powłoce? (która okazuje się bash)
Ticks
podobną obudowę systemu Windows?Odpowiedzi:
Użyj wbudowanego
time
słowa kluczowego:Przykład:
źródło
time -p i=x; while read line; do x=x; done < /path/to/file.txt
? Natychmiast zwraca 0,00, chyba że nie wstawię niczego przed pętlą while. Co daje?time
można odmierzać czas trwania całego potoku w stanie, w jakim się znajduje (ze względu na to, że jest słowem kluczowym Bash ), musisz użyć polecenia group ({ ...; ...; }
), abytime -p { i=x; while read line; do x=x; done < /path/to/file.txt; }
type -a time
Możesz uzyskać znacznie bardziej szczegółowe informacje niż wbudowane bash
time
(o czym wspomina Robert Gamble), używając czasu (1) . Zwykle tak jest/usr/bin/time
.Uwaga edytora: Aby upewnić się, że wywołujesz zewnętrzne narzędzie
time
zamiasttime
słowa kluczowego powłoki , wywołaj je jako/usr/bin/time
.time
jest narzędziem wymaganym przez POSIX , ale jedyną opcją wymaganą do obsługi jest-p
.Konkretnych platform realizacji konkretnych niestandardowe rozszerzenia:
-v
prace z GNU „stime
użyteczności, jak pokazano poniżej (pytanie jest oznaczonelinux); implementacja BSD / macOS używa-l
do generowania podobnych wyników - patrzman 1 time
.Przykład pełnego wyjścia:
źródło
źródło
Do pomiaru delta linia po linii spróbuj gnomon .
Możesz także użyć opcji
--high
i / lub,--medium
aby określić próg długości w sekundach, powyżej którego gnomon podświetli znacznik czasu na czerwono lub żółto. Możesz także zrobić kilka innych rzeczy.źródło
Jeśli chcesz uzyskać większą precyzję, użyj
%N
zdate
(i użyjbc
dla diff, ponieważ$(())
obsługuje tylko liczby całkowite).Oto jak to zrobić:
Przykład:
Wynik:
źródło
Jeśli zamierzasz wykorzystać czasy później do obliczeń, dowiedz się, jak korzystać z
-f
opcji/usr/bin/time
generowania kodu, który oszczędza czas. Oto kod, którego ostatnio użyłem, aby uzyskać i posortować czasy wykonania całej klasy programów dla studentów:Później połączyłem wszystkie
$timefile
pliki i potokowałem dane wyjściowe do interpretera Lua . Możesz zrobić to samo z Pythonem, bash lub dowolną ulubioną składnią. Uwielbiam tę technikę.źródło
/usr/bin/time
jest konieczna, ponieważ chociażwhich time
powie ci inaczej, jeśli po prostu uruchomisztime
, uruchomi ona wersję powłoki,time
która nie przyjmuje żadnych argumentów.env time
Jeśli potrzebujesz dokładności co do sekundy, możesz użyć wbudowanej
$SECONDS
zmiennej, która zlicza liczbę sekund, które uruchomiła powłoka.źródło
Możesz użyć
time
i podpowłoki()
:Lub w tej samej powłoce
{}
:źródło
(
&)
(nowy kontekst, podpowłoka ), a inne z{
&}
(ta sama powłoka, ten sam kontekst)Tak jest
wyjście to >>
źródło
-lphtread
ani-o
tagować. Wystarczy użyćtime
polecenia, które zaakceptowana odpowiedź wyjaśnia lepiej.jedną z możliwie prostych metod (która może nie spełniać różnych potrzeb użytkowników) jest użycie powłoki PROMPT. jest to proste rozwiązanie, które może być przydatne w niektórych przypadkach. Możesz użyć funkcji monitowania bash, jak w poniższym przykładzie:
Powyższe polecenie spowoduje zmianę monitu powłoki na:
Za każdym razem, gdy uruchomisz polecenie (lub naciśniesz Enter), wracając do monitu powłoki, w monicie wyświetli się bieżąca godzina.
uwagi:
1) strzeż się, że jeśli poczekałeś chwilę przed wpisaniem następnego polecenia, to należy wziąć to pod uwagę, tj. czas wyświetlany w wierszu polecenia powłoki jest znacznikiem czasu, gdy polecenie wiersza było wyświetlane, a nie po wprowadzeniu polecenia. niektórzy użytkownicy wybierają klawisz Enter, aby otrzymać nowy monit z nowym znacznikiem czasu, zanim będą gotowi na następne polecenie.
2) Istnieją inne dostępne opcje i modyfikatory, których można użyć do zmiany monitu bash, patrz (man bash), aby uzyskać więcej szczegółów.
źródło