GNU/Linux >> Belajar Linux >  >> Linux

Apa cara tercepat untuk menjalankan skrip?

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 .

  1. 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
    
  2. 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
    
  3. 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...


Linux
  1. Linux – Bagaimana Cara Menjalankan Script Pada Layar Lock/unlock?

  2. Dapatkan Script Untuk Berjalan Lagi Jika Input Ya?

  3. Cara Tercepat Untuk Mengekstrak Iso?

  1. Cara "Tepat" Untuk Menguji Jika Suatu Layanan Berjalan Dalam Skrip?

  2. Apa yang Digema $? Mengerjakan??

  3. Cara Membuat Script Shell Selalu Jalankan Sebagai Root?

  1. Apa Tujuan The Colon Builtin ':' Melayani?

  2. Apa cara terbaik untuk memastikan hanya satu contoh skrip Bash yang berjalan?

  3. Apa cara yang tepat untuk menggunakan inotify?