Saya selalu berpikir bahwa satu-satunya manfaat menggunakan dasbor daripada bash adalah dasbor lebih kecil, dan karena itu banyak contoh dasbor akan mulai lebih cepat saat boot.
Tetapi saya telah melakukan beberapa penelitian, dan menemukan beberapa orang memigrasi semua skrip mereka ke dash dengan harapan mereka akan berjalan lebih cepat, dan saya juga menemukan ini dalam artikel DashAsBinSh di Wiki Ubuntu:
Alasan utama untuk mengganti shell default adalah efisiensi . bash adalah shell dengan fitur lengkap yang luar biasa yang cocok untuk penggunaan interaktif; memang, itu masih shell login default. Namun, ini agak besar dan lambat untuk memulai dan beroperasi dengan perbandingan dengan tanda hubung.
Saat ini saya telah menggunakan banyak skrip bash untuk banyak hal di sistem saya, dan masalah saya adalah saya memiliki skrip tertentu yang saya jalankan terus menerus 24/7, yang memunculkan sekitar 200 anak, yang bersama-sama memanaskan komputer saya 10 ° C lebih dari pada penggunaan normal.
Ini adalah skrip yang agak besar dengan banyak bashisme, jadi porting mereka ke POSIX atau shell lain akan sangat memakan waktu (dan POSIX tidak terlalu penting untuk penggunaan pribadi), tetapi akan sangat berharga jika saya dapat mengurangi sebagian dari ini Penggunaan CPU. Saya tahu ada juga hal-hal lain yang perlu dipertimbangkan, seperti memanggil binary eksternal seperti sed
untuk bashism sederhana seperti ${foo/bar}
, atau grep
bukannya =~
.
TL; DR benar-benar lebih lambat untuk memulai dan beroperasi dibandingkan dengan tanda hubung? Apakah ada cangkang Unix lain yang lebih efisien daripada bash?
sumber
[
juga harus menjadi builtin.bash
Dulu sangat lambat. Ini membuat banyak kemajuan baru-baru ini, tetapi untuk sebagian besar hal, masih lebih lambat daripada kebanyakan shell lainnya.[ "$foo" != "${foo#*bar}" ]
menangani hal grep Anda. Dansed
hal:while [ "$foo" != "${foo#*bar}" ]; do s=$s${foo%%bar*} foo=${foo#*bar} ; done ; foo=$s$foo
. Anda dapat menempatkan salah satu dari fungsi tersebut.Jawaban:
SHELL SEQ:
Mungkin cara yang berguna untuk menilai kinerja sebuah shell adalah dengan melakukan banyak evaluasi kecil yang sangat sederhana secara berulang-ulang. Penting, saya pikir, tidak hanya untuk mengulang, tetapi untuk mengulang masukan , karena shell perlu membaca
<&0
.Saya pikir ini akan melengkapi tes @ cuonglm yang sudah diposting karena itu menunjukkan kinerja proses shell tunggal sekali dipanggil, sebagai lawannya yang menunjukkan seberapa cepat proses shell dimuat ketika dipanggil. Dengan cara ini, di antara kami, kami menutupi kedua sisi mata uang.
Inilah fungsi untuk memfasilitasi demo:
Entah itu menambah variabel satu kali per baris membaca baru atau, sebagai sedikit optimasi, jika bisa, itu meningkat 50 kali per baris membaca baru. Setiap kali variabel bertambah itu dicetak ke
stdout
. Berperilaku seperti semacamseq
salibnl
.Dan hanya untuk membuatnya sangat jelas apa yang dilakukannya - inilah beberapa
set -x;
keluaran yang terpotong setelah memasukkannya tepattime
pada fungsi di atas:Jadi setiap shell pertama kali disebut seperti:
... untuk menghasilkan input yang diperlukan untuk mengulang ketika dibaca
3<<\SCRIPT
- atau kapancat
, bagaimanapun. Dan di sisi lain|pipe
itu menyebut dirinya lagi seperti:Jadi selain dari panggilan awal ke
env
(karenacat
sebenarnya dipanggil di baris sebelumnya) ; tidak ada proses lain yang dipanggil sejak dipanggil sampai keluar. Setidaknya, saya harap itu benar.Sebelum angka ...
Saya harus membuat beberapa catatan tentang portabilitas.
posh
tidak suka$((n=n+1))
dan bersikeras$((n=$n+1))
mksh
tidak memilikiprintf
builtin dalam banyak kasus. Tes sebelumnya membuatnya tertinggal banyak - itu memohon/usr/bin/printf
untuk setiap lari. Karena itu diecho -n
atas.mungkin lebih seperti yang saya ingat ...
Pokoknya, ke nomor:
Itu akan membuat mereka semua sekaligus ...
ARBITRARI = MUNGKIN OK?
Namun, ini adalah tes yang agak sewenang-wenang, tetapi tes input membaca, evaluasi aritmatika, dan ekspansi variabel. Mungkin tidak komprehensif, tetapi mungkin dekat dengan sana.
EDIT oleh Teresa e Junior : @mikeserv dan saya telah melakukan banyak tes lain (lihat detail obrolan kami ), dan kami menemukan hasilnya dapat diringkas seperti ini:
grep
,sed
,sort
, dll, yang tidak memiliki banyak fitur seperti GNU yang umum digunakan utilitas, tetapi bisa menyelesaikan pekerjaan sebanyak mungkin.sumber
4.2.37(1)-release
dari Debian dan4.2.45(2)-release
dari Porteus LiveCD (Slackware). Tanpanull=
, alih-alih mengeluarkan angka, itu berfungsi seolah-olah saya menekan Return terus menerus, maka saya harus membunuh bash dengan SIGKILL .bash --posix
, tetapi tidak berhasil.zsh
.zsh
akan membajaktty
dan baik, itu akan meluncurkan shell interaktif. Saya berharapbash
akan melakukan hal yang sama - itulah sebabnya saya berhati-hati untuk hanya memanggil--posix
tautannya. Saya bisa membuatnya seperti yang Anda harapkan untuk sebagian besar dari mereka, tetapi mungkin lebih banyak pekerjaan daripada nilainya. Apakah Anda meneleponbash
atau meneleponsh
?Mari lakukan benchmark.
Dengan
bash
:Dengan
dash
:Setiap iterasi hanya memulai shell dan tidak melakukan apa-apa dengan operator tanpa op - titik dua , lalu berhenti.
Seperti yang diperlihatkan hasil,
dash
sangat cepat daripadabash
saat startup.dash
lebih kecil, dan bergantung pada pustaka yang kurang dibagi daripadabash
:Ini tentang waktu startup, bagaimana beroperasi. Mari lakukan patokan lain:
Dengan tes sederhana
1 = 1
,dash
masih jauh lebih cepat daripadabash
.sumber
seq 1 100000
seharusnyaseq 1 1000
?dash
test case Anda hanyaseq 1 1000
?1000
untuk startup dan1000000
untuk operasi, diperbaiki.Berikut ini beberapa pengaturan waktu startup dari berbagai shell di UNIX bersertifikat (Mac OS X 10.10.3). Saya menulis ulang tes untuk menggunakan tcsh untuk mengontrol loop sehingga shell yang diuji bukan yang mengendalikan loop. Untuk setiap shell, loop dieksekusi lima kali sebelum penghitungan waktu, untuk memastikan bahwa shell dieksekusi dan skrip berada dalam cache.
Seperti yang Anda lihat, tidak ada pemenang yang jelas, tetapi ada satu pecundang yang pasti. Bagaimanapun, bash 4 jelas lebih lambat dari bash 3. Dash berkinerja baik, tetapi mengingat bahwa ksh93 sekarang open-source, tidak ada alasan nyata untuk tidak menggunakannya untuk semuanya (permintaan maaf jika saya salah paham tentang segala jenis lisensi): ksh93 cepat, solid , dan standar de-facto di UNIX-land (jika tidak di GNU / Linux-land); ia menyediakan superset dari fungsi shell POSIX (sejauh yang saya mengerti, shell POSIX didasarkan pada ksh88); itu sama dengan bash sebagai shell interaktif, meskipun tertinggal dibandingkan dengan tcsh. Dan yang kalah tentu saja zsh.
sumber
Ada terlalu banyak kasus uji yang tidak adil dalam banyak jawaban di sini. Jika menguji dua shell maka gunakan sintaks yang benar untuk masing-masing. Dan dalam bash, doublebracket jauh lebih cepat dan lebih dapat diandalkan daripada singlebracket, jadi ada perbedaan kecepatan yang jauh lebih sedikit sama sekali. Juga gunakan bashism yang dioptimalkan dan kemudian perbedaan kecepatan ini juga lebih sedikit. Di sistem saya, bash berjalan seperti neraka, dengan banyak menggunakan bashism. Dan setara posix di dasbor lebih lambat di sini. Ini tidak benar bahwa tanda hubung selalu beberapa kali lebih cepat daripada bash. Benar-benar sangat tidak adil untuk membandingkan baris perintah posix di keduanya, yang berlari selalu menjadi yang tercepat. Dalam pandangan saya posix sudah usang. Dan dalam hal kompatibilitas, sangat sulit untuk menemukan sistem yang relevan saat ini, mereka tidak menggunakan bash shell.
Perbandingan yang baik adalah: menggunakan baris perintah terbaik di setiap shell, untuk menyelesaikan pekerjaan tertentu. Bukan hanya baris perintah yang persis sama, ketika hanya satu shell yang benar-benar memiliki keunggulan di sini. Perbandingan seperti ini tidak dapat diandalkan dan tidak menunjukkan kinerja nyata dari para pesaing. Saya melihat pada pekerjaan saya setiap hari, shell mana yang lebih cepat dalam banyak kasus penggunaan.
Misalnya, untuk mengganti semua
a
karakter dalam string denganb
karakter, di bash Anda dapat menulis"${varname//a/b}"
sementara di dasbor Anda harus memanggil alat eksternal seperti ini:"$(echo "$varname" | sed 's/a/b/g')"
. Jika Anda harus mengulanginya beberapa ratus kali - menggunakan bashism dapat memberi Anda 2x percepatan.sumber