SORU
29 Ocak 2009, PERŞEMBE


Nasıl olursa gcc kuyruk özyineleme optimizasyonu performans kontrol edebilirim?

Nasıl olursa gcc (daha spesifik olarak, g ) kuyruk özyineleme optimize olursa söylerimbelirli bir fonksiyon? (Birkaç kez geldi çünkü: eğer gcc genel olarak. kuyruk özyineleme optimize eğer test etmek istemiyorum Eğer optimize eder bilmek istiyorumbenimkuyruk özyinelemeli fonksiyon.)

Yanıtınız "bak oluşturulan çevirici", bilmek istiyorum tam olarak ne aradığımı, ve olsun ya da olmasın ben yazarım basit bir programı olduğunu inceler çevirici, bak bakalım optimizasyon.

PS. Bu soruyu parçası 7* *5 ay önce gibi görünüyor biliyorum. Ancak, sanmıyorumbu kısımbu soruya tatmin edici bir cevap oldu. (Cevabı vardı "En kolay yolu için, derleyici mi optimizasyonu (bildiğim kadarıyla) gerçekleştirmek bir telefon o olur, aksi halde neden bir yığın taşması – ya bakıyor derleme çıktı.")

CEVAP
29 Ocak 2009, PERŞEMBE


Hadi the example code from the other question kullanın. Derleme, ama gcc birleştirin söyle:

gcc -std=c99 -S -O2 test.c

Şimdi sonuç olarak _atoi fonksiyonuna baktest.sdosya (4.0.1 Mac OS 10.5 gcc):

        .text
        .align 4,0x90
_atoi:
        pushl   p
        testl   x, x
        movl    %esp, p
        movl    x, x
        je      L3
        .align 4,0x90
L5:
        movzbl  (�x), x
        testb   %al, %al
        je      L3
        leal    (�x,�x,4), x
        movsbl  %al,�x
        incl    x
        leal    -48(�x,�x,2), x
        jne     L5
        .align 4,0x90
L3:
        leave
        movl    x, x
        ret

Derleyici bu fonksiyon tail call optimizasyonu gerçekleştirdi. Orijinal C kodu açıkça bir işlev çağrısı vardı Oysa bu kodu call talimat yok çünkü söyleyebiliriz. Ayrıca, geriye dönük işlevi atlar jne L5 talimat, açıkça C kodu döngü vardı hiçbir zaman bir döngüye işaret edebiliriz. Eğer optimizasyon kapalı ile yeniden derleyin, call _atoi ve ayrıca, herhangi bir geri atlar görmeyecek yazan bir satır göreceksiniz.

Otomatik hale getirebilirsiniz olsun bu başka bir konudur. Çevirici kod özelliklerini derlemek kodu bağlıdır.

Bu program aracılığıyla keşfetmek olabilir, bence. Geçerli bir değer olarak işlev yazdırma işaretçi yığını (x 86 kayıt ESP). Eğer işlevi özyinelemeli arama için olduğu gibi İlk Çağrı için aynı değeri yazdırır, derleyici tail call optimizasyonu gerçekleştirdi. Bu fikir gözlemlemek için umut işlevini değiştirme gerektirir, ama derleyici bu fonksiyonu optimize etmek için seçer nasıl etkileyebilir. Eğer test başarılı (parmak izleri aynı ESP değeri iki kez), o zaman bence makul varsayıyorum olan iyileştirmeyi de gerçekleştirilecek olmadan gereçleri, ama eğer test başarısız olur bilemeyiz olup başarısızlık nedeniyle ek gereçleri kodu.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ELawshea

    ELawshea

    26 Mayıs 2008
  • TopOfTheTech

    TopOfTheTech

    5 NİSAN 2010
  • Wronchi Animation

    Wronchi Anim

    9 Mayıs 2011