Kabuk döngüleri yavaş ve bash en yavaş. Mermilerin mermilerde ağır iş yapması gerekmiyor. Kabuklar, birkaç veri grubu üzerinde birkaç harici, optimize edilmiş işlem başlatmak içindir.
Her neyse, kabuk döngülerinin nasıl karşılaştırıldığını merak ettim, bu yüzden küçük bir değerlendirme yaptım:
#!/bin/bash
export IT=$((10**6))
echo POSIX:
for sh in dash bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'i=0; while [ "$IT" -gt "$i" ]; do i=$((i+1)); done'
done
echo C-LIKE:
for sh in bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'for ((i=0;i<IT;i++)); do :; done'
done
G=$((10**9))
TIMEFORMAT="%RR %UU %SS 1000*C"
echo 'int main(){ int i,sum; for(i=0;i<IT;i++) sum+=i; printf("%d\n", sum); return 0; }' |
gcc -include stdio.h -O3 -x c -DIT=$G -
time ./a.out
(
Ayrıntılar:
- İşlemci: Intel (R) Çekirdek (TM) i5 CPU M 430 @ 2.27GHz
- ksh: sürüm sh (AT&T Araştırması) 93u + 2012-08-01
- bash: GNU bash, sürüm 4.3.11 (1) - yayın (x86_64-pc-linux-gnu)
- zsh: zsh 5.2 (x86_64-bilinmeyen-linux-gnu)
- tire: 0.5.7-4ubuntu1
)
(Kısaltılmış) sonuçlar (yineleme başına zaman):
POSIX:
5.8 µs dash
8.5 µs ksh
14.6 µs zsh
22.6 µs bash
C-LIKE:
2.7 µs ksh
5.8 µs zsh
11.7 µs bash
C:
0.4 ns C
Sonuçlardan:
Biraz daha hızlı bir kabuk döngüsü istiyorsanız, [[
sözdizimine sahipseniz ve hızlı bir kabuk döngüsü istiyorsanız, gelişmiş bir kabuktasınız ve döngü için de C benzeri bir sisteminiz var. O zaman döngü için C benzeri kullanın. while [
Aynı kabuktaki-döngülerden 2 kat daha hızlı olabilirler .
- ksh , yineleme başına
for (
yaklaşık 2,7µs'de en hızlı döngüye sahiptir
- çizgi her yineleme başına
while [
yaklaşık 5.8µs en hızlı döngü vardır
Döngüler için C, 3-4 ondalık büyüklükte daha hızlı olabilir. (Torvalds'ın C'yi sevdiğini duydum).
Döngü için en iyi duruma getirilmiş C, bash while [
döngüsünden (en yavaş kabuk döngüsü) 56500 kat daha hızlı ve ksh for (
döngüsünden (en hızlı kabuk döngüsü) 6750 kat daha hızlıdır .
Yine, kabukların yavaşlığı çok da önemli olmamalıdır, çünkü kabukları olan tipik kalıp dış, optimize edilmiş programların birkaç işlemine boşaltmaktır.
Bu kalıpla, kabuklar genellikle python komut dosyalarından daha üstün performansa sahip komut dosyaları yazmayı çok daha kolaylaştırır (en son kontrol ettiğimde python'da işlem boru hatları oluşturmak oldukça sakardı).
Dikkate alınması gereken başka bir şey, başlangıç zamanı.
time python3 -c ' '
bilgisayarımda 30 ila 40 ms sürüyor, kabukları ise 3 ms. Çok fazla komut dosyası başlatırsanız, bu hızlı bir şekilde eklenir ve python'un daha yeni başlaması için gerekli olan 27-37 msn'de çok fazla şey yapabilirsiniz. Küçük komut dosyaları bu zaman dilimi içinde birkaç kez tamamlanabilir.
(DüğümJ'ler muhtemelen bu bölümdeki en kötü komut dosyası çalıştırma zamanıdır, çünkü yalnızca başlatılması yaklaşık 100ms sürer (bir kez başlasa bile, betik dilleri arasında daha iyi bir performans bulmak için zorlanırsınız)).