Ben sadece bu cevapta bazı genel tavsiyeler vereceğim, ölçütler değil. Karşılaştırmalar, performansla ilgili soruları güvenilir bir şekilde cevaplamanın tek yoludur. Ancak, ne kadar veri işlediğinizi ve bu işlemi ne sıklıkta gerçekleştirdiğinizi söylemediğinizden, yararlı bir kıyaslama yapmanın bir yolu yoktur. 10 ürün için daha verimli ve 1000000 ürün için daha verimli olan genellikle aynı değildir.
Genel bir kural olarak, dış komutları çağırmak, saf kabuk kodu bir döngü içermediği sürece, saf kabuk yapılarıyla bir şey yapmaktan daha pahalıdır. Öte yandan, büyük bir dize veya büyük miktarda dize üzerinde yinelenen bir kabuk halkasının, özel amaçlı bir aracın çağrılmasından daha yavaş olması muhtemeldir. Örneğin, döngü çağırmanız cut
uygulamada farkedilir derecede yavaş olabilir, ancak her şeyi tek bir cut
başlatma ile yapmanın bir yolunu bulursanız , kabuğunda dize işlemiyle aynı şeyi yapmaktan daha hızlı olması muhtemeldir.
Kesme noktasının sistemler arasında çok fazla değişiklik gösterebileceğini unutmayın. Çekirdeğe, çekirdeğin zamanlayıcısının nasıl yapılandırıldığına, harici çalıştırılabilir dosyaları içeren dosya sistemine, şu anda ne kadar CPU - bellek baskısı olduğuna ve diğer birçok faktöre bağlı olabilir.
expr
Performansla ilgili endişeleriniz varsa, aritmetik yapmak için arama yapmayın . Aslında, hiç expr
aritmetik yapmak için arama . Kabuklar yerleşik aritmetiktir ve bu da çağırmaktan daha net ve hızlıdır expr
.
Bash kullanıyor görünüyorsunuz, çünkü sh içinde bulunmayan bash yapıları kullanıyorsunuz. Öyleyse neden dünyada bir dizi kullanmıyorsun? Bir dizi en doğal çözümdür ve bunun da en hızlı olması muhtemeldir. Dizi indekslerinin 0'dan başladığını unutmayın.
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
Eğer sh kullanıyorsanız betiğiniz daha hızlı olabilir, eğer sisteminizde sh
bash yerine tire veya ksh varsa . Eğer sh kullanırsanız, dizileri adlandırmazsınız, ancak diziyi yine de ayarlayabileceğiniz konumsal parametrelerden birini alırsınız set
. Bir elemana çalışma zamanına kadar bilinmeyen bir pozisyonda erişmek için kullanmanız gerekir eval
(doğru şekilde alıntı yapmak için dikkatli olun!).
# 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
Diziye yalnızca bir kez erişmek istiyorsanız ve soldan sağa gidiyorsanız (bazı değerleri atlayarak), shift
değişken dizinler yerine kullanabilirsiniz .
# 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
Hangi yaklaşımın daha hızlı olduğu, kabuğa ve elementlerin sayısına bağlıdır.
Başka bir olasılık string işlemenin kullanılmasıdır. Konumsal parametreleri kullanmama avantajına sahiptir, böylece bunları başka bir şey için kullanabilirsiniz. Büyük miktarda veri için daha yavaştır, ancak küçük miktarlarda veri için fark edilebilir bir fark yaratması mümkün değildir.
# 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