Terminal hari ini lebih lambat dari sebelumnya, terutama karena kartu grafis tidak lagi peduli dengan akselerasi 2D. Jadi memang, mencetak ke terminal dapat memperlambat skrip, terutama saat pengguliran terlibat.
Akibatnya ./script.sh
lebih lambat dari ./script.sh >script.log
, yang pada gilirannya lebih lambat dari /script.sh >/dev/null
, karena yang terakhir melibatkan lebih sedikit pekerjaan. Namun apakah ini membuat perbedaan yang cukup untuk tujuan praktis apa pun tergantung pada seberapa banyak keluaran yang dihasilkan skrip Anda dan seberapa cepat. Jika skrip Anda menulis 3 baris dan keluar, atau jika skrip mencetak 3 halaman setiap beberapa jam, Anda mungkin tidak perlu repot dengan pengalihan.
Edit: Beberapa tolok ukur cepat (dan benar-benar rusak):
-
Di konsol Linux, 240x75:
$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done) real 3m52.053s user 0m0.617s sys 3m51.442s
-
Dalam
xterm
, 260x78:$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done) real 0m1.367s user 0m0.507s sys 0m0.104s
-
Alihkan ke file, pada disk Samsung SSD 850 PRO 512 GB:
$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done >file) real 0m0.532s user 0m0.464s sys 0m0.068s
-
Alihkan ke
/dev/null
:$ time (for i in {1..100000}; do echo $i 01234567890123456789012345678901234567890123456789; done >/dev/null) real 0m0.448s user 0m0.432s sys 0m0.016s
Saya akan secara naluriah setuju dengan jawaban Satō Katsura; masuk akal. Namun, cukup mudah untuk mengujinya.
Saya menguji menulis sejuta baris ke layar, menulis (menambahkan) ke file, dan mengalihkan ke /dev/null
. Saya menguji masing-masing secara bergantian, lalu melakukan lima ulangan. Ini adalah perintah yang saya gunakan.
$ time (for i in {1..1000000}; do echo foo; done)
$ time (for i in {1..1000000}; do echo foo; done > /tmp/file.log)
$ time (for i in {1..1000000}; do echo foo; done > /dev/null)
Saya kemudian merencanakan total waktu di bawah.
Seperti yang Anda lihat, anggapan Satō Katsura benar. Sesuai jawaban Satō Katsura, saya juga ragu bahwa faktor pembatasnya adalah output, jadi sepertinya pilihan output tidak akan berdampak besar pada kecepatan skrip secara keseluruhan.
FWIW, jawaban asli saya memiliki kode yang berbeda, yang menambahkan file dan /dev/null
redirect di dalam lingkaran.
$ rm /tmp/file.log; touch /tmp/file.log; time (for i in {1..1000000}; do echo foo >> /tmp/file.log; done)
$ time (for i in {1..1000000}; do echo foo > /dev/null; done)
Seperti yang ditunjukkan John Kugelman dalam komentar, ini menambah banyak biaya tambahan. Seperti pertanyaannya, ini sebenarnya bukan cara yang tepat untuk mengujinya, tetapi saya akan meninggalkannya di sini karena ini dengan jelas menunjukkan biaya untuk membuka kembali file berulang kali dari dalam skrip itu sendiri.
Dalam hal ini, hasilnya dibalik.
Cara lain untuk mempercepat skrip adalah dengan menggunakan juru bahasa shell yang lebih cepat. Bandingkan kecepatan POSIX loop sibuk, jalankan di bawah bash
v4.4 , ksh
v93u+20120801 , dan dash
v0.5.8 .
-
bash
:time echo 'n=0;while [ $n -lt 1000000 ] ; do \ echo $((n*n*n*n*n*n*n)) ; n=$((n+1)); done' | bash -s > /dev/null
Keluaran:
real 0m25.146s user 0m24.814s sys 0m0.272s
-
ksh
:time echo 'n=0;while [ $n -lt 1000000 ] ; do \ echo $((n*n*n*n*n*n*n)) ; n=$((n+1)); done' | ksh -s > /dev/null
Keluaran:
real 0m11.767s user 0m11.615s sys 0m0.010s
-
dash
:time echo 'n=0;while [ $n -lt 1000000 ] ; do \ echo $((n*n*n*n*n*n*n)) ; n=$((n+1)); done' | dash -s > /dev/null
Keluaran:
real 0m4.886s user 0m4.690s sys 0m0.184s
Sebuah bagian perintah di bash
dan ksh
kompatibel mundur ke semua perintah di dash
. A bash
skrip yang hanya menggunakan perintah dalam subset itu harus bekerja dengan dash
.
Beberapa bash
skrip yang menggunakan fitur baru dapat dikonversi ke juru bahasa lain. Jika bash
skrip sangat bergantung pada fitur yang lebih baru, mungkin tidak perlu repot -- beberapa bash
baru fitur adalah peningkatan yang lebih mudah untuk dikodekan dan lebih efisien, (meskipun bash
umumnya lebih lambat), sehingga dash
setara, (yang mungkin melibatkan menjalankan beberapa perintah lain), akan lebih lambat.
Jika ragu, jalankan tes...