SORU
27 AĞUSTOS 2012, PAZARTESİ


&; 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
27 AĞUSTOS 2012, PAZARTESİ


Hayır, bir çok mimari daha hızlı olacaktır. Belirlediğiniz vermedi, ama genellikle iki makine talimatları uygulanacak tüm 86,:

  • EFLAGS ayarlar test cmp bir yönerge
  • Jcc (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

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DorkmanScott

    DorkmanScott

    14 NİSAN 2006
  • TomSka

    TomSka

    30 Mayıs 2006
  • TouchePro

    TouchePro

    27 EYLÜL 2007