Il problema: una riga evidente di un codice accelera un programma quasi due volte.gcc arithmetics simple loop performance
Questo è piuttosto difficile da formulare un problema originale, deriva da un algoritmo di eliminazione del controllo dei limiti. Quindi, solo un semplice test che non riesco a capire.
Una riga in più evidente di un codice porta ad accelerare un programma quasi due volte.
C'è fonte seguente:
#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*/
In questo esempio il valore 'a' è sempre 0. La linea x = 0; è extra.
Ma, (aspetto -! NO alcuna ottimizzazione)
$ gcc -o -O0 breve short.c & & tempo ./short
a = 0
reali 0m2.808s
0m2.196s utente
sys 0m0.596s
$ gcc -O0 -DFAST -o brevi short.c & & tempo ./short
a = 0
0m1.869s reali
utente 0m1.260s
sys 0m0.608s
E, questo è riproducibile su molti compilatori/opzioni di ottimizzazione e variazioni di programma.
Inoltre, hanno veramente lo stesso codice assemblatore, tranne che per mettere questo stupido 0 in più in qualche registro! Ad esempio:
gcc -S -O0 -DFAST short.c & & mv short.s shortFAST.s
gcc -S -O0 short.c & & short.s mv shortSLOW.s
shortFAST.s diff shortSLOW.s
55d54
< movq $ 0, -24 (% RBP)
E, un po 'dopo - lo stesso effetto su alcune (tutto quello che ho avuto modo di testare) altri compilatori/lingue (tra cui Java JIT). L'unica cosa è stata condivisa - l'architettura x86-64. È stato testato su processori Intel e AMD ...
Per favore, mai punto di riferimento senza ottimizzazioni. È come cronometrare il cruscotto di Usain Bolt a 100 m senza dirgli che dovrebbe scappare. – Mysticial
La riga 'x = 0;' sarà probabilmente eseguita una sola volta. La piegatura costante è un'ottimizzazione piuttosto semplice. Il flag '-O0' non significa realmente" * no * ottimizzazione "- molto accade nella fase di pre-elaborazione. – usr2564301
@Mystical: dipende ... Ovviamente non si dovrebbe confrontare ottimizzato con codice non- (o diversamente) ottimizzato. Ma testare con le stesse identiche ottimizzazioni * può * essere utile per testare gli algoritmi stessi, indipendentemente dalle ottimizzazioni specifiche del compilatore. – usr2564301