Nasıl olursa gcc kuyruk özyineleme optimizasyonu performans kontrol edebilirim? | Netgez.com
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

  • Air_Fooj

    Air_Fooj

    24 NÄ°SAN 2009
  • InfoPuppet

    InfoPuppet

    15 Kasım 2011
  • KIT KAT

    KIT KAT

    3 EKÄ°M 2005