SORU
8 EYLÜL 2011, PERŞEMBE


Neden kullanın __yerleşik_basit bir şekilde if-else kullanmak için ne bekliyorsunuz

Bir rastladım #hangi __yerleşik_bekliyoruz. kullandıkları tanımlama

Bazı googling sonra GNU belgelerinde buldum:

— Built-in Function: long __builtin_expect (long exp, long c)

__Yerleşik_şube tahmini bilgileri derleyici sağlamak için bekliyoruz kullanabilirsiniz. Programcılar, programlarını gerçekte nasıl performans tahmin, rezil gibi. genel olarak, bu gerçek profili geribildirim kullanmayı tercih etmelisiniz (-fprofile-yay), Ancak, bu veri toplamak için uygulamalar vardır.

Dönüş değeri ayrılmaz bir ifadesi olması gereken exp değeridir. Bu yerleşik anlamı o == c exp bekleniyor. Örneğin:

      if (__builtin_expect (x, 0))
        foo ();

x sıfır için bekliyoruz beri foo aramak için beklemeyin biz gösteriyor. Exp için integral ifadeleri ile sınırlı olduğundan, yapılar gibi kullanmalısınız

Benim sorum: Peki neden doğrudan kullanın:

                 if ( x != 0 )
                    foo( );

karmaşık sözdizimi yerine bekliyorsun?

CEVAP
8 EYLÜL 2011, PERŞEMBE


Dan oluşturulan derleme kodu düşünün:

if (__builtin_expect(x, 0)) {
    foo();
    ...
} else {
    bar();
    ...
}

Böyle bir şey olmalı sanırım

  cmp   $x, 0
  jne   _foo
_bar:
  call  bar
  ...
  jmp   after_if
_foo:
  call  foo
  ...
after_if:

Talimatları bar kasa foo dava C kod aksine) önündeki böyle bir sıraya göre düzenlenmiş olduğunu görebilirsiniz. Bu bir atlama zaten getirilen talimatları dayakçı beri CPU boru hattı kullanmak daha iyi olabilir.

Atlama yürütülmeden önce, aşağıdaki talimatları (bar) boru hattına itti. foo davanın Olası olmadığından, sıçrama çok düşüktür, bu nedenle boru hattı pek mümkün değildir yapıyorsunuz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • TheGamer2323

    TheGamer2323

    25 Ocak 2009
  • warningthepeople

    warningthepe

    21 EYLÜL 2011