// g++ fibonacci-midiendo-tiempos_v2.cpp -lrt -O3 && ./a.out | tee fibonacci-midiendo-tiempos_v2.resultados #include #include // setprecision #include // clock_gettime using namespace std; double segundosDiferencia(timespec inicio, timespec fin) { const double nano = 1e9; return ( (fin.tv_sec + fin.tv_nsec / nano) - (inicio.tv_sec + inicio.tv_nsec / nano) ); } long long fibonacciRecursiva(int n) { if (n <= 1) return n; return fibonacciRecursiva(n-1) + fibonacciRecursiva(n-2); } long long fibonacciIterativa(int n) { long long penultimo = 0, ultimo = 1, fibonacci = n; for (int i = 2; i <= n; i++) { fibonacci = ultimo + penultimo; penultimo = ultimo; ultimo = fibonacci; } return fibonacci; } double cronometrar(long long (*algoritmo)(int), int dato) { timespec tiempoInicial, tiempoFinal; clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tiempoInicial); long long resultado = algoritmo(dato); clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &tiempoFinal); cout << "Fibonacci(" << dato << ") = " << resultado << endl; return segundosDiferencia(tiempoInicial, tiempoFinal); } int main () { int dato; long long resultado; timespec tiempoInicial, tiempoFinal; cout << fixed << setprecision(10); for (dato = 0; dato <= 50; dato++) { double tiempoSolucionRecursiva = cronometrar(fibonacciRecursiva, dato); double tiempoSolucionIterativa = cronometrar(fibonacciIterativa, dato); cout << dato << "\t" << tiempoSolucionIterativa << "\t" << tiempoSolucionRecursiva << endl; } }