Neden't GCC "x & & (&4242 x)" için "x & 4242" mantıksal bit VE çift iyileştirebilirsiniz? | Netgez.com
SORU
14 NÄ°SAN 2014, PAZARTESÄ°


Neden't GCC "x & & (&4242 x)" için "x & 4242" mantıksal bit VE çift iyileştirebilirsiniz?

Burada tam olarak aynı şeyi yapardım iddia eden iki işlevi vardır:

bool fast(int x)
{
  return x & 4242;
}

bool slow(int x)
{
  return x && (x & 4242);
}

Mantıken aynı işi yapıyorlar, ve her ikisi de dört milyar olası tüm girişleri koşan bir test yazdım 0 emin olmak için, ve onlar eşleşti. Ama derleme kod farklı bir hikaye

fast:
    andl    $4242, íi
    setne   %al
    ret

slow:
    xorl    êx, êx
    testl   íi, íi
    je      .L3
    andl    $4242, íi
    setne   %al
.L3:
    rep
    ret

GCC mantık artık gereksiz test ortadan kaldırmak için yapamadı şaşırdım. Aynı kod tarafından oluşturulan ve g 4.4.3 4.7.2-O2, -O3,- Os denedim. Platform Linux x86_64.

Birisi GCC her iki durumda da aynı kodu oluşturmak için zeki olması gerekmez mi neden açıklayabilir mi? Ayrıca diğer Derleyiciler daha iyi yapabileceğini bilmek istiyorum.

Edit test koşum eklemek için:

#include <cstdlib>
#include <vector>
using namespace std;

int main(int argc, char* argv[])
{
    // make vector filled with numbers starting from argv[1]
    int seed = atoi(argv[1]);
    vector<int> v(100000);
    for (int j = 0; j < 100000;   j)
        v[j] = j   seed;

    // count how many times the function returns true
    int result = 0;
    for (int j = 0; j < 100000;   j)
        for (int i : v)
            result  = slow(i); // or fast(i), try both

    return result;
}

Mac OS üzerinde ise 5.1-O3 ile yukarıdaki test ettim. 2.9 saniye fast() kullanma ve 3.8 saniye slow() kullanarak aldı. Eğer ben bunun yerine tüm sıfır vektör kullanın, iki işlevi arasında performans açısından önemli bir fark yoktur.

CEVAP
14 NÄ°SAN 2014, PAZARTESÄ°


Tam olarak nedengerekirbu kodu? optimize edebilir Çalışan herhangi bir dönüşüm yapılacak varsayıyorsun. Bu doktorları nasıl çalıştığını değil. Yapay Zeka değiller. Onlar sadece parametrik olarak bilinen kalıpları değiştirerek çalışır. E. g. "Ortak Alt ifade Elemesi eğer bu yan etkiler değiştirir mi yoksa" ortak taşıyıcının için bir ifade tarar ve onları ileri taşır.

(BTW, EE zaten optimize kod hareketi yan etkileri Olası varlığı izin ne olduğunu gayet iyi biliyor olduğunu gösterir. && ile dikkatli olmak zorunda olduğunu biliyorlar. İster expr && expr EE-optimize edilebilir ya*. *10) yan etkileri bağlı.

Yani, özetle: hangi şekil geçerlidir sence?

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • PaulGBelliveau

    PaulGBellive

    5 Mart 2009
  • Rachel Raum

    Rachel Raum

    10 EYLÃœL 2007
  • ThisWeekYT

    ThisWeekYT

    14 Mart 2013