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

  • GoProTutorials

    GoProTutoria

    18 NİSAN 2011
  • MuscleProdigyTV

    MuscleProdig

    8 Ocak 2011
  • TastyTuts | Creative video tutorials by Gareth David

    TastyTuts |

    6 Temmuz 2011