L'altro giorno mi sono imbattuto in uno strano problema utilizzando GCC e il flag di ottimizzazione '-Ofast'. Compilando il seguente programma usando 'gcc -Ostile -o fib1 fib1.c'.Differenze di ottimizzazione GCC in funzioni ricorsive usando le variabili globali
#include <stdio.h>
int f1(int n) {
if (n < 2) {
return n;
}
int a, b;
a = f1(n - 1);
b = f1(n - 2);
return a + b;
}
int main(){
printf("%d", f1(40));
}
Quando si misura il tempo di esecuzione, il risultato è:
[email protected] ~ $ time ./fib1
102334155
real 0m0.511s
user 0m0.510s
sys 0m0.000s
Ora introduciamo una variabile globale nel nostro programma e compilare di nuovo usando 'gcc -o -Ofast fib2 fib2.c'.
#include <stdio.h>
int global;
int f1(int n) {
if (n < 2) {
return n;
}
int a, b;
a = f1(n - 1);
b = f1(n - 2);
global = 0;
return a + b;
}
int main(){
printf("%d", f1(40));
}
Ora il tempo di esecuzione è:
[email protected] ~ $ time ./fib2
102334155
real 0m0.265s
user 0m0.265s
sys 0m0.000s
La nuova variabile globale non fa qualcosa di significativo. Tuttavia, la differenza nei tempi di esecuzione è considerevole.
Oltre alla domanda (1) quale sia la ragione per tale comportamento, sarebbe anche bello se (2) l'ultima prestazione potesse essere raggiunta senza introdurre variabili prive di significato. Eventuali suggerimenti?
Grazie Peter
La prima cosa che sospetto sono i metodi di analisi comparativa dei pesci. – Lundin
Hai indicato livelli di ottimizzazione meno aggressivi, come '-O3' o' -O2'? –
Una misura non è sufficiente per formare una statistica – StoryTeller