Saya bertanya-tanya apakah ada pedoman umum untuk mengoptimalkan skrip Bash.
Sebagai contoh, lebih mudah untuk menulis loop daripada baris perintah, tetapi apakah lebih cepat untuk memproses sistem? Contoh:
for i in a b c; do echo $i; done echo a echo b echo c
Terkadang orang menghadirkan solusi berbeda untuk masalah yang sama. Sebagai contoh,
sed
,cut
,awk
, danecho
semua mampu melucuti digit dari string. Saya bertanya-tanya apakah Anda dapat mengatakan bahwa semakin sedikit kode digit, semakin cepat jika Anda menggunakan:perintah yang sama, mis
STRING=abc.def echo ${STRING} | sed 's/.def//g' echo ${STRING} | sed '$s/....$//'
perintah yang berbeda, mis
STRING=abc.def echo ${STRING} | cut -d . -f 1 echo ${STRING} | sed 's/.def//g'
shell-script
Vincent
sumber
sumber
Jawaban:
Shells tidak melakukan reorganisasi kode yang mereka dapatkan, itu hanya ditafsirkan satu demi satu baris (tidak ada yang lebih masuk akal dalam penerjemah perintah). Sebagian besar waktu yang dihabiskan oleh shell digunakan untuk analisis leksikal / parsing / meluncurkan program yang disebut.
Untuk operasi sederhana (seperti string munging dalam contoh di akhir pertanyaan), saya akan terkejut jika waktu memuat program tidak membanjiri perbedaan kecepatan yang sangat kecil.
Moral dari cerita ini adalah bahwa jika Anda benar-benar membutuhkan lebih banyak kecepatan, Anda lebih baik dengan bahasa yang dikompilasi (semi) seperti Perl atau Python, yang lebih cepat dijalankan untuk memulai, di mana Anda dapat menulis banyak operasi yang disebutkan secara langsung dan tidak perlu memanggil program eksternal, dan memiliki opsi untuk memanggil program eksternal atau memanggil modul C (atau apa pun) yang dioptimalkan untuk melakukan banyak pekerjaan. Itulah alasan mengapa di Fedora "gula administrasi sistem" (GUI, pada dasarnya) ditulis dengan Python: Dapat menambahkan GUI yang bagus dengan tidak terlalu banyak upaya, cukup cepat untuk aplikasi seperti itu, memiliki akses langsung ke panggilan sistem. Jika itu tidak cukup cepat, ambil C ++ atau C.
Tetapi jangan pergi ke sana, kecuali jika Anda dapat membuktikan bahwa perolehan kinerja sepadan dengan hilangnya fleksibilitas dan waktu pengembangan. Skrip shell tidak terlalu buruk untuk dibaca, tetapi saya bergidik ketika saya ingat beberapa skrip yang digunakan untuk menginstal Ultrix Saya pernah mencoba menguraikan. Saya menyerah, terlalu banyak "optimasi skrip shell" telah diterapkan.
sumber
Aturan optimasi pertama adalah: jangan optimalkan . Tes dulu. Jika tes menunjukkan bahwa program Anda terlalu lambat, cari kemungkinan optimasi.
Satu-satunya cara untuk memastikan adalah dengan melakukan benchmark untuk use case Anda. Ada beberapa aturan umum, tetapi mereka hanya berlaku untuk volume data khas dalam aplikasi tipikal.
Beberapa aturan umum yang mungkin atau mungkin tidak benar dalam keadaan tertentu:
echo $foo
lebih lambat daripadaecho "$foo"
, karena tanpa tanda kutip ganda, itu terbagi$foo
menjadi kata-kata dan menafsirkan setiap kata sebagai pola wildcard nama file. Lebih penting lagi, bahwa perilaku membelah dan menggumpal jarang diinginkan. Jadi ingatlah untuk selalu menempatkan tanda kutip ganda di sekitar substitusi variabel dan substitusi perintah:"$foo"
,"$(foo)"
.cut
atauhead
bisa ditirused
, tetapised
akan lebih lambat danawk
bahkan akan lebih lambat. Pemrosesan string shell lambat, tetapi untuk string pendek sebagian besar mengalahkan memanggil program eksternal.Jarang bahwa kinerja menjadi perhatian dalam skrip shell. Daftar di atas adalah murni indikatif; itu baik-baik saja untuk menggunakan metode "lambat" dalam banyak kasus karena perbedaannya seringkali sepersekian persen.
Biasanya inti dari skrip shell adalah menyelesaikan sesuatu dengan cepat. Anda harus mendapatkan banyak dari optimasi untuk membenarkan menghabiskan menit tambahan menulis skrip.
sumber
python
danruby
pasti lebih lambat untuk memulai, setidaknya pada sistem saya,perl
sama cepatnya dengan memulaibash
atauksh
. GNU awk secara signifikan lebih lambat daripada GNU sed terutama di utf-8 locales, tapi itu tidak benar untuk semua awk dan semua sed. bash ksh93> dash> pdksh> zsh> tidak selalu sejelas itu. Beberapa cangkang lebih baik dalam beberapa hal daripada yang lain, dan pemenangnya tidak selalu sama.Dicuri Dari Kesalahan skrip shell umum oleh Pádraig Brady.
sumber
for i in *; do wc -l "$i">/dev/null; done
melakukannya lebih baikfor i in *; do wc -l "$i"; done>/dev/null
.time
cmdwc -l
, periksa saya telah memperbarui dalam posting output Anda