Zawsze myślałem, że jedyną korzyścią z używania myślnika zamiast basha jest to, że myślnik był mniejszy, a zatem wiele wystąpień myślnika zaczynało się szybciej w czasie rozruchu.
Ale przeprowadziłem pewne badania i znalazłem ludzi migrujących wszystkie swoje skrypty, aby pobiegać w nadziei, że będą działać szybciej, i znalazłem to również w artykule DashAsBinSh na Ubuntu Wiki:
Głównym powodem zmiany domyślnej powłoki była wydajność . bash to doskonała, w pełni funkcjonalna powłoka odpowiednia do użytku interaktywnego; w rzeczywistości jest to nadal domyślna powłoka logowania. Jednak jest dość duży i powolny, aby uruchomić i działać w porównaniu z deską rozdzielczą.
Obecnie używam wielu skryptów bash do wielu rzeczy w moim systemie, a moim problemem jest to, że mam szczególny skrypt, który działam nieprzerwanie 24/7, który odradza około 200 dzieci, które razem ogrzewają mój komputer 10 ° C więcej niż podczas normalnego użytkowania.
Jest to dość duży skrypt z mnóstwem bashizmów, więc przeniesienie ich do POSIXa lub innej powłoki byłoby bardzo czasochłonne (a POSIX tak naprawdę nie ma znaczenia do użytku osobistego), ale byłoby warto, gdybym mógł zmniejszyć część tego Użycie procesora. Wiem, że są też inne rzeczy do rozważenia, takie jak wywołanie zewnętrznego pliku binarnego, takiego jak sed
prosty bashizm ${foo/bar}
, lub grep
zamiast =~
.
TL; DR jest naprawdę wolniejszy w uruchamianiu i działa w porównaniu z deską rozdzielczą? Czy istnieją inne powłoki Unix, które są bardziej wydajne niż bash?
źródło
[
powinien być również wbudowany.bash
Kiedyś był bardzo wolny. Ostatnio poczyniono znaczne postępy, ale w większości przypadków jest on wolniejszy niż większość innych pocisków.[ "$foo" != "${foo#*bar}" ]
obsługuje twoją grep. Ised
rzecz:while [ "$foo" != "${foo#*bar}" ]; do s=$s${foo%%bar*} foo=${foo#*bar} ; done ; foo=$s$foo
. Możesz umieścić dowolną rzecz w funkcji.Odpowiedzi:
SEQ SHELL:
Prawdopodobnie przydatnym sposobem oceny wydajności powłoki jest powtarzalne powtarzanie wielu bardzo małych, prostych ocen. Myślę, że ważne jest, aby nie tylko zapętlić, ale także zapętlić dane wejściowe , ponieważ powłoka musi czytać
<&0
.Myślałem, że uzupełni to testy już opublikowane @cuonglm, ponieważ pokazuje wydajność pojedynczego procesu powłoki po jej wywołaniu, w przeciwieństwie do tego, który pokazuje, jak szybko ładuje się proces powłoki po wywołaniu. W ten sposób między nami pokrywamy obie strony monety.
Oto funkcja ułatwiająca pokaz:
Inkrementuje zmienną raz na odczyt nowego wiersza lub, w miarę możliwości, zwiększa 50 razy na odczyt nowego wiersza. Za każdym razem, gdy zmienna jest zwiększana, jest drukowana do
stdout
. Zachowuje się jakseq
krzyżnl
.I żeby wyjaśnić, co robi - oto niektóre skrócone
set -x;
dane wyjściowe po wstawieniu go tuż przedtime
powyższą funkcją:Tak więc każda powłoka jest najpierw nazywana:
... aby wygenerować dane wejściowe, które będą musiały być zapętlone, gdy wczyta się
3<<\SCRIPT
- lub kiedy tocat
zrobi. Z drugiej strony|pipe
nazywa się ponownie:Poza początkowym wywołaniem do
env
(ponieważcat
tak naprawdę jest wywoływane w poprzedniej linii) ; żadne inne procesy nie są wywoływane od momentu jego wywołania do momentu wyjścia. Przynajmniej mam nadzieję, że to prawda.Przed liczbami ...
Powinienem zrobić kilka notatek na temat przenośności.
posh
nie lubi$((n=n+1))
i nalega na$((n=$n+1))
mksh
printf
w większości przypadków nie ma wbudowanego. Wcześniejsze testy znacznie go opóźniały - wywoływały/usr/bin/printf
każdy bieg. Stądecho -n
powyższe.może bardziej, jak pamiętam ...
W każdym razie do liczb:
Wszystko to za jednym razem ...
ARBITRARY = MOŻE BYĆ OK?
Jest to jednak raczej arbitralny test, ale testuje on odczyt danych, ocenę arytmetyczną i rozszerzanie zmiennych. Może nie wyczerpujące, ale być może blisko.
EDIT autorstwa Teresy e Junior : @mikeserv i ja przeprowadziliśmy wiele innych testów (szczegóły na naszym czacie ) i stwierdziliśmy, że wyniki można podsumować w następujący sposób:
grep
,sed
,sort
, itd., Które nie mają za wiele funkcji, jak powszechnie stosowanych GNU narzędzia, ale mogą zrobić tyle samo.źródło
4.2.37(1)-release
z Debiana i4.2.45(2)-release
z LiveCD Porteus (Slackware). Beznull=
, zamiast wypisywania liczb, działa tak, jakbym ciągle naciskał Return , wtedy muszę zabić Basha za pomocą SIGKILL .bash --posix
, ale bezskutecznie.zsh
.zsh
przejmietty
i cóż, uruchomi interaktywną powłokę. Oczekuję,bash
że zrobię to samo - dlatego ostrożnie nazywam tylko jego--posix
link. Mogę zrobić tak, jak oczekujesz dla większości z nich, ale może to być więcej pracy niż jest warte. Dzwoniszbash
czy dzwoniszsh
?Zróbmy punkt odniesienia.
Z
bash
:Z
dash
:Każda iteracja uruchamia tylko powłokę i nic nie robi z operatorem no-op - dwukropkiem , a następnie kończy działanie.
Jak pokazują wyniki,
dash
jest niezwykle szybszy niżbash
podczas uruchamiania.dash
jest mniejszy i zależy od mniej współdzielonej biblioteki niżbash
:Chodzi o czas uruchamiania, a co powiesz na działanie. Zróbmy kolejny punkt odniesienia:
Z prostym testem
1 = 1
,dash
wciąż znacznie szybszym niżbash
.źródło
seq 1 100000
powinno byćseq 1 1000
?dash
przypadku testowym to tylkoseq 1 1000
?1000
do uruchomienia i1000000
obsługi, naprawione.Oto niektóre czasy uruchamiania różnych powłok w certyfikowanym systemie UNIX (Mac OS X 10.10.3). Przepisałem test, aby użyć tcsh do sterowania pętlami, aby testowana powłoka nie była tą kontrolującą pętle. Dla każdej powłoki pętla jest wykonywana pięć razy przed upływem czasu, aby upewnić się, że wykonywalna powłoka i skrypty są w pamięci podręcznej.
Jak widać, nie ma wyraźnego zwycięzcy, ale jest jeden ostateczny przegrany. W każdym razie, bash 4 jest wyraźnie wolniejszy niż bash 3. Dash działa dobrze, ale biorąc pod uwagę, że ksh93 jest teraz open source, nie ma prawdziwego powodu, aby nie używać go do wszystkiego (przepraszam, jeśli źle rozumiem jakiekolwiek elementy licencyjne): ksh93 jest szybki, solidny oraz de facto standard w UNIX-land (jeśli nie w GNU / Linux-land); zapewnia nadzbiór funkcjonalności powłoki POSIX (o ile rozumiem, powłoka POSIX była oparta na ksh88); jest równy bashowi jako interaktywnej powłoce, choć opóźnia się w porównaniu do tcsh. A przegrany to oczywiście zsh.
źródło
Istnieje wiele nieuczciwych przypadków testowych w wielu odpowiedziach tutaj. Jeśli przetestujesz dwie powłoki, użyj poprawnej składni dla każdej z nich. A w bash podwójne nawiasy są znacznie szybsze i bardziej niezawodne niż pojedyncze nawiasy, więc różnica prędkości jest znacznie mniejsza. Używaj również zoptymalizowanych bashism, a wtedy te różnice prędkości są również mniejsze. W moim systemie bash działa jak diabli, z dużym użyciem bashism. A ekwiwalenty posfiksu w myślniku są tutaj wolniejsze. To nie jest poprawne, że myślnik jest zawsze wielokrotnie szybszy niż uderzenie. Naprawdę niesprawiedliwe jest porównywanie linii poleceń POSIX-a w obu, których kreska zawsze może być najszybsza. Moim zdaniem posix jest mocno przestarzały. Jeśli chodzi o kompatybilność, obecnie bardzo trudno jest znaleźć odpowiednie systemy, nie używali powłoki bash.
Dobrym porównaniem jest: użycie najlepszego możliwego wiersza poleceń w każdej powłoce, aby zakończyć określone zadanie. Nie tylko dokładnie ta sama linia poleceń, gdy tylko jedna powłoka ma tutaj przewagę. Takie porównania są niewiarygodne i nie pokazują prawdziwej wydajności konkurentów. W mojej codziennej pracy widzę, która powłoka jest szybsza w wielu przypadkach użycia.
Na przykład, aby zastąpić wszystkie
a
znaki z łańcuchab
znaków, w bash można napisać"${varname//a/b}"
natomiast w desce rozdzielczej trzeba zadzwonić zewnętrznego narzędzia takiego:"$(echo "$varname" | sed 's/a/b/g')"
. Jeśli musisz to powtórzyć kilkaset razy - użycie bashizmu może dać 2x przyspieszenie.źródło