Saya hanya akan memberikan beberapa saran umum dalam jawaban ini, dan bukan tolok ukur. Benchmark adalah satu-satunya cara untuk secara andal menjawab pertanyaan tentang kinerja. Tetapi karena Anda tidak mengatakan berapa banyak data yang Anda manipulasi dan seberapa sering Anda melakukan operasi ini, tidak ada cara untuk melakukan benchmark yang berguna. Apa yang lebih efisien untuk 10 item dan apa yang lebih efisien untuk 1000000 item seringkali tidak sama.
Sebagai aturan umum, menjalankan perintah eksternal lebih mahal daripada melakukan sesuatu dengan konstruksi shell murni, selama kode shell murni tidak melibatkan loop. Di sisi lain, perulangan shell yang beriterasi pada string besar atau sejumlah besar string cenderung lebih lambat dari satu permintaan alat tujuan khusus. Misalnya, menjalankan loop Anda cut
bisa terasa lambat dalam praktik, tetapi jika Anda menemukan cara untuk melakukan semuanya dengan satucut
pemanggilan yang mungkin lebih cepat daripada melakukan hal yang sama dengan manipulasi string dalam shell.
Perhatikan bahwa titik batas dapat sangat bervariasi antar sistem. Itu dapat bergantung pada kernel, pada bagaimana penjadwal kernel dikonfigurasikan, pada sistem file yang berisi executable eksternal, pada seberapa banyak tekanan CPU vs memori yang ada saat ini, dan banyak faktor lainnya.
Jangan menelepon expr
untuk melakukan aritmatika jika Anda benar-benar khawatir tentang kinerja. Bahkan, jangan menelepon expr
untuk melakukan aritmatika sama sekali. Kerang memiliki aritmatika bawaan, yang lebih jelas dan lebih cepat daripada memohon expr
.
Anda tampaknya menggunakan bash, karena Anda menggunakan konstruksi bash yang tidak ada di sh. Jadi mengapa Anda tidak menggunakan array? Array adalah solusi yang paling alami, dan kemungkinan akan menjadi yang tercepat juga. Perhatikan bahwa indeks array mulai dari 0.
list=(1 2 3 5 9 8 6 90 84 9 3 2 15 75 55)
for ((count = 0; count += 3; count < ${#list[@]})); do
echo "${list[$count]}"
done
Skrip Anda mungkin lebih cepat jika Anda menggunakan sh, jika sistem Anda memiliki tanda hubung atau ksh sh
daripada bash. Jika Anda menggunakan sh, Anda tidak mendapatkan array bernama, tetapi Anda masih mendapatkan array salah satu parameter posisi, yang dapat Anda atur set
. Untuk mengakses elemen pada posisi yang tidak diketahui sampai runtime, Anda perlu menggunakan eval
(berhati-hatilah mengutip sesuatu dengan benar!).
# List elements must not contain whitespace or ?*\[
list='1 2 3 5 9 8 6 90 84 9 3 2 15 75 55'
set $list
count=1
while [ $count -le $# ]; do
eval "value=\${$count}"
echo "$value"
count=$((count+1))
done
Jika Anda hanya ingin mengakses array sekali dan bergerak dari kiri ke kanan (melewatkan beberapa nilai), Anda dapat menggunakan shift
sebagai ganti indeks variabel.
# List elements must not contain whitespace or ?*\[
list='1 2 3 5 9 8 6 90 84 9 3 2 15 75 55'
set $list
while [ $# -ge 1 ]; do
echo "$1"
shift && shift && shift
done
Pendekatan mana yang lebih cepat tergantung pada shell dan jumlah elemen.
Kemungkinan lain adalah menggunakan pemrosesan string. Ini memiliki keuntungan karena tidak menggunakan parameter posisi, sehingga Anda dapat menggunakannya untuk hal lain. Ini akan lebih lambat untuk sejumlah besar data, tetapi itu tidak mungkin membuat perbedaan nyata untuk sejumlah kecil data.
# List elements must be separated by a single space (not arbitrary whitespace)
list='1 2 3 5 9 8 6 90 84 9 3 2 15 75 55'
while [ -n "$list" ]; do
echo "${list% *}"
case "$list" in *\ *\ *\ *) :;; *) break;; esac
list="${list#* * * }"
done