Questo è il codice che ho provato:Perché gcc genera un programma più veloce di clang in questo codice ricorsivo di Fibonacci?
#include <iostream>
#include <chrono>
using namespace std;
#define CHRONO_NOW chrono::high_resolution_clock::now()
#define CHRONO_DURATION(first,last) chrono::duration_cast<chrono::duration<double>>(last-first).count()
int fib(int n) {
if (n<2) return n;
return fib(n-1) + fib(n-2);
}
int main() {
auto t0 = CHRONO_NOW;
cout << fib(45) << endl;
cout << CHRONO_DURATION(t0, CHRONO_NOW) << endl;
return 0;
}
Naturalmente, ci sono modi molto più veloce di calcolo dei numeri di Fibonacci, ma questo è un buon test po 'di stress che si concentra su chiamate di funzione ricorsive. Non c'è nient'altro al codice, se non l'uso del cronometro per misurare il tempo.
Prima ho eseguito il test un paio di volte in Xcode su OS X (quindi è clang), utilizzando l'ottimizzazione -O3. Ci sono voluti circa 9 secondi per correre.
Quindi, ho compilato lo stesso codice con gcc (g ++) su Ubuntu (usando di nuovo -O3), e quella versione impiegava solo circa 6,3 secondi per essere eseguita! Inoltre, stavo usando Ubuntu all'interno di VirtualBox sul mio Mac, il che poteva influenzare negativamente la performance, se non del tutto.
Così ci si va:
clangore su OS X -> ~ 9 secondi
gcc su Ubuntu in VirtualBox -> ~ 6.3 sec.
So che si tratta di compilatori completamente diversi, quindi fanno cose diverse, ma tutti i test che ho visto con gcc e clang hanno mostrato solo una differenza minore, e in alcuni casi la differenza era il contrario (clang essere più veloce).
Quindi c'è qualche spiegazione logica perché gcc batte il clang per miglia in questo particolare esempio?
Hai controllato l'uscita dell'assieme? E qual è la versione di Clang e gcc? –
Non utilizzare queste definizioni.Ecco come si usa la direttiva 'using':' usando chrono_time_point = chrono :: high_resolution_clock :: time_point; ' – Cubic
guarda il codice generato, è una semplice funzione –