&; Daha hızlı &;=lt lt?
Yazar if( a < 901 )
Daha hızlı if( a <= 900 )
Daha olduğunu söylüyor nerede bir kitap okuyorum.
Yok tam olarak bu basit bir örnek, ama hafif performans döngü karmaşık kod üzerinde değişiklikler var. Bu bile gerçek olma ihtimali oluşturulan makine kodu ile bir ilgisi var sanırım.
CEVAP
Hayır, bir çok mimari daha hızlı olacaktır. Belirlediğiniz vermedi, ama genellikle iki makine talimatları uygulanacak tüm 86,:
EFLAGS
ayarlartest
cmp
bir yönergeJcc
(jump) instruction karşılaştırma bağlı bir türü (kod düzeni):jne
- Atlama yoksa -- ^ eşit .ZF = 0
jz
sıfır ise Atla (eşit) -->ZF = 1
jg
- eğer daha fazla olsaydı Atlama -->ZF = 0 and SF = OF
- (vb...)
Örnek(Kısalık için düzenlenmiş) $ gcc -m32 -S -masm=intel test.c
ile Derlenmiş
if (a < b) {
// Do something 1
}
Derler:
mov eax, DWORD PTR [esp 24] ; a
cmp eax, DWORD PTR [esp 28] ; b
jge .L2 ; jump if a is >= b
; Do something 1
.L2:
Ve
if (a <= b) {
// Do something 2
}
Derler:
mov eax, DWORD PTR [esp 24] ; a
cmp eax, DWORD PTR [esp 28] ; b
jg .L5 ; jump if a is > b
; Do something 2
.L5:
Yani ikisi arasındaki tek fark jg
jge
karşı bir bir anlatılıyor. İki kez aynı miktarda alacak.
Hiçbir şey farklı talimatlar zaman aynı miktarda almak atlamak belirten bir açıklama yapmak istiyorum. Bu biraz zor bir cevabı var, ama burada ne yapabilirim: Intel Instruction Set Reference, hepsi toplanmışlar altında bir yaygın eğitim, Jcc
(atlarsan koşulu ile). Aynı araya gelmelerin Optimization Reference Manual Ek C. Gecikme süresi ve işlem Hacmi altında yapılır.
Gecikme— İçin gereken saat döngüsü sayısı yürütme oluşturan µops tüm yürütme tamamlamak için çekirdek bir yönerge.
İşlem hacmi— Saat döngüsü sayısı için gerekli bu konu daha önce bekle noktaları aynı yönergenin kabul etmek ücretsizdir yine. Birçok talimatlar için, bir talimat aktarımı olabilir önemli ölçüde gecikme daha az
Jcc
değerleri
Latency Throughput
Jcc N/A 0.5
Jcc
sonraki Dipnot
7) koşullu atlama talimatları Seçimi bölüm önerisi Bölüm 3.4.1, “Şube Tahmin Optimizasyonu,” dallar tahmin edilebilirliği geliştirmek için. dayalı olmalıdır Dalları başarıyla tahmin edilmektedir,
jcc
gecikme etkili sıfırdır.
Yani, Intel doktorlar hiç bir şey Jcc
bir komutun diğerlerinden farklı davranır.
Eğer bir düşünür hakkında gerçek devresi kullanılan uygulamak için talimatları, kabul olur basit VE/VEYA kapıları üzerinde farklı bit EFLAGS
, olup olmadığını belirlemek için koşullar bir araya geldi. Sonra, bir eğitim, iki bit Test daha fazla alması gerektiğini veya bu sebeple tek tek test daha az zaman (Görmezden kapısı yayılma gecikmesi, saat süre çok daha az.) yok
Edit: Kayan Nokta
Bu x 87 kayan nokta için de geçerli olduğu söylenebilir: (double
ile yukarıdaki gibi, ancak hemen hemen aynı kod yerine int
.)
fld QWORD PTR [esp 32]
fld QWORD PTR [esp 40]
fucomip st, st(1) ; Compare ST(0) and ST(1), and set CF, PF, ZF in EFLAGS
fstp st(0)
seta al ; Set al if above (CF=0 and ZF=0).
test al, al
je .L2
; Do something 1
.L2:
fld QWORD PTR [esp 32]
fld QWORD PTR [esp 40]
fucomip st, st(1) ; (same thing as above)
fstp st(0)
setae al ; Set al if above or equal (CF=0).
test al, al
je .L5
; Do something 2
.L5:
leave
ret
&; Daha hızlı &;=lt lt?...
Neden Python kodunu daha hızlı bir işl...
Hangisi daha hızlı: while(1) veya(2)?...
Tabanlı uygulamalar Hızlı bir işletim ...
Neden [] liste daha hızlı()?...