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
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?
Neden JavaScript ile " baÅŸlatmak i...
Neden ekleme "" bir Dize içi...
# 5 CTP uyumsuz C: neden iç "devl...
E çift kolon " ne anlama geliyor;::&qu...
Neden Boş Dizeleri Bitiştirmek için Ge...