Problem: jedna ewidentnie dodatkowa linia kodu przyspiesza program prawie dwukrotnie.prosta pętla arytmetyczna gcc wydajność
To raczej trudne do sformułowania oryginalny problem, pochodzi z algorytmu eliminacji sprawdzania ograniczeń. A więc po prostu prosty test, którego nie rozumiem.
Jedna ewidentnie dodatkowa linia kodu prowadzi do przyspieszenia programu prawie dwukrotnie.
znajduje się następujące źródła:
#include <stdlib.h>
#include <stdio.h>
int main(void)
{
long i = 0, a = 0, x = 0;
int up = 200000000;
int *values = malloc(sizeof(int)*up);
for (i = 0; i < up ; ++i)
{
values[i]=i % 2;
}
for (i = 0; i < up ; ++i)
{
x = (a & i);
#ifdef FAST
x = 0;
#endif
a += values[x];
}
printf ("a=%ld\n", a);
return 0;
}/*main*/
W tym przypadku wartość 'a' jest zawsze 0. Linia x = 0; jest ekstra.
Ale (wygląd - Nie Obojętnie optymalizacje)
$ gcc -o -O0 krótki short.c & & czas ./short
a = 0
prawdziwe 0m2.808s
0m2.196s użytkowników
SYS 0m0.596s
$ gcc -o -O0 -DFAST krótkie short.c & & czas ./short
a = 0
prawdziwe 0m1.869s
użytkownik 0m1.260s
sys 0m0.608s
I to jest powtarzalne w wielu kompilatorów/opcji optymalizacji i wariantów programowych.
Co więcej, naprawdę dają ten sam kod assemblera, z wyjątkiem umieszczenia tego głupiego dodatkowego 0 w jakimś rejestrze! Np
gcc -S -O0 -DFAST short.c & & mv short.s shortFAST.s
gcc -S -O0 short.c & & mv short.s shortSLOW.s
diff shortFAST.s shortSLOW.s
55d54
< MOVQ $ 0, -24 (% RBP)
A nieco później - tym samym wpływ na niektóre (wszystko udało mi się przetestować) inne kompilatory/języki (w tym Java JIT). Została udostępniona tylko architektura x86-64. Przetestowano na procesorach Intel i AMD ...
Proszę nie dokonywać testów porównawczych bez optymalizacji. To tak, jakby czas na 100-minutowy kres Usaina Bolta, nie mówiąc mu, że powinien uciekać. – Mysticial
Linia 'x = 0;' zostanie prawdopodobnie wykonana tylko raz. Ciągłe składanie jest dość podstawową optymalizacją. Flaga '-O0' nie ma na myśli" * nie * optymalizacji "- dużo dzieje się na etapie przetwarzania wstępnego. – usr2564301
@Mystical: to zależy ... Oczywiście nie powinieneś porównywać zoptymalizowanego z nie- (lub inaczej) zoptymalizowanym kodem. Ale testowanie z takimi samymi optymalizacjami * może * być przydatne do testowania samych algorytmów, niezależnie od optymalizacji kompilatora. – usr2564301