Jeśli naprawdę dostajesz pierwszą linię i czytasz setki plików, rozważ wbudowane powłoki zamiast zewnętrznych zewnętrznych poleceń, użyj read
, która jest powłoką wbudowaną dla basha i ksh.Eliminuje to narzut stworzenia procesowego z awk
, sed
, head
itd
Inna sprawa robi dokładnego analizy wydajności na I/O. Przy pierwszym otwarciu, a następnie odczytaniu pliku, dane pliku prawdopodobnie nie są przechowywane w pamięci podręcznej. Jeśli jednak spróbujesz ponownie wykonać drugie polecenie dla tego samego pliku, zarówno dane, jak i i-węzeł zostały zbuforowane, więc wyniki czasowe mogą być szybsze, prawie bez względu na używane polecenie. Dodatkowo, i-węzły mogą pozostać w pamięci podręcznej praktycznie na zawsze. Robią na przykład na Solarisie. Lub w każdym razie, kilka dni.
Na przykład, linux buforuje wszystko i zlew kuchenny, co jest dobrym atrybutem wydajności. Ale powoduje to problemy z benchmarkingiem, jeśli nie jesteś świadomy problemu.
Wszystkie te "zakłócenia" efektu buforowania zależą od systemu operacyjnego i sprzętu.
Tak więc - wybierz jeden plik, przeczytaj go za pomocą polecenia. Teraz jest buforowany. Uruchamiaj to samo polecenie testowe kilkadziesiąt razy, to jest próbkowanie efektu działania polecenia i procesu potomnego, a nie sprzętu I/O.
to sed vs odczytu do 10 powtórzeń na uzyskanie pierwszej linii tego samego pliku, po odczytać pliku jednorazowo:
sed: sed '1{p;q}' uopgenl20121216.lis
real 0m0.917s
user 0m0.258s
sys 0m0.492s
odczytu: read foo < uopgenl20121216.lis ; export foo; echo "$foo"
real 0m0.017s
user 0m0.000s
sys 0m0.015s
Jest to wyraźnie wymyślne, ale pokazuje różnicę między wbudowaną wydajnością a użyciem polecenia.
Wykorzystanie 'oddać porównywalnych towarów do pomiaru polecenia. – choroba
Dlaczego rurka 'cat' w narzędzia? Mogą otwierać pliki samodzielnie, a jeśli martwisz się wydajnością, prawdopodobnie mogą to zrobić lepiej. Ale tak, rura powinna "przesyłać strumieniowo" tylko kilka pierwszych bloków pliku (a następnie zauważyć, że konsument przestał się troszczyć). – Thilo