SORU
25 EKİM 2011, Salı


Erken verimli bir işlev dönüş

Ben bunu sık sık tecrübesiz bir programcı olarak karşılaşma ve özellikle benim, hızlı-yoğun iddialı bir proje için optimize etmeye çalışıyorum merak ediyorum bir durum. C gibi dilleri (C, C objC , C#, Java vs) Ve onların her zamanki Derleyiciler Binbaşı için, bu iki işlevi etkili bir biçimde çalışır mı? Derlenmiş kod içinde herhangi bir fark var mı?

void foo1(bool flag)
{
    if (flag)
    {
        //Do stuff
        return;
    }

    //Do different stuff
}

void foo2(bool flag)
{
    if (flag)
    {
        //Do stuff
    }
    else
    {
        //Do different stuff
    }
}

Hiç breaking veya returnErken ıng, doğrudan verimlilik bonus/ceza var temelde? Nasıl stackframe işin içinde mi? Özel durumlarda optimize var mı? Herhangi bir faktör (satır içi uygulaması veya büyüklüğünde önemli ölçüde bu? etkileyebilecek "şeyler" vardır

Ben her zaman bir savunucusu geliştirilmiş okunabilirlik üzerinde küçük iyileştirmeler (görüyorum foo1 bir sürü parametre doğrulama), ama bu kadar sık geliyor ki isterdim kenara endişelenecek bir kez ve için tüm.

Ve erken optimizasyon tuzaklar farkındayım... ah, o acı hatıralar.

EDİT: kabul ettim bir cevap, ama EJP cevabı açıklar çok kısaca neden kullanımı return pratik olarak ihmal edilebilir (montaj, return oluşturur bir 'şube' ucunda işlevi, son derece hızlı. Dalı PC kayıt değiştirir ve aynı zamanda oldukça küçük bir önbellek ve boru hattı etkileyebilir.) Özellikle bu durum için, if/else return iki fonksiyonun sonuna kadar şube oluşturma çünkü tam anlamıyla hiç fark etmez.

CEVAP
25 EKİM 2011, Salı


Fark yoktur

=====> cat test_return.cpp
extern void something();
extern void something2();

void test(bool b)
{
    if(b)
    {
        something();
    }
    else
        something2();
}
=====> cat test_return2.cpp
extern void something();
extern void something2();

void test(bool b)
{
    if(b)
    {
        something();
        return;
    }
    something2();
}
=====> rm -f test_return.s test_return2.s
=====> g   -S test_return.cpp 
=====> g   -S test_return2.cpp 
=====> diff test_return.s test_return2.s
=====> rm -f test_return.s test_return2.s
=====> clang   -S test_return.cpp 
=====> clang   -S test_return2.cpp 
=====> diff test_return.s test_return2.s
=====> 

Hiçbir fark anlamını bile optimizasyon olmaksızın iki kod derleyici tarafından oluşturulan

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Andrey Menshikov

    Andrey Mensh

    28 Ocak 2012
  • Ryan Billy

    Ryan Billy

    30 EKİM 2006
  • Vicious Computers

    Vicious Comp

    14 EKİM 2006