This is an old revision of the document!
Nous nous intéressons à l'estimation du temps de calcul des fonction factorial
et des fonctions power_by_int
que nous avons défini précédemment.
auto fn = estimate_function_time(factorial, 100); std::cout << "Computing fact(100)=" << fn .second << " in " << fn.first.count() << " ticks.\n"; auto pw = estimate_function_time(power_by_int<long double>, 1.0002, 1000000); std::cout << "Computing 1.02^1000000=" << pw.second << " in " << pw.first.count() << " ticks.\n";
Ceci nous retourne le temps mis pour calculer la fonction factorial
et pour la fonction power_by_int
.
Expérimenter.
Nous souvaitons indiquer au compilateur qu'il peut calculer au moment de la compilation les expressions si celles-ci sont constantes.
Pour ce faire nous ajoutons le mot-clé constexpr
devant la fonction ou l'expression dont la valeur peut-être exécuté au moment de la compilation.
Ainsi, nous pouvons indiquer que les deux fonctions factorial
et power_by_int
peuvent être calculer au moment de la compilation si les arguments sont des valeurs définies au moment de la compilation.
constexpr long double factorial(int n) { return n == 0 ? 1 : n * factorial(n - 1); } template<class numericalT> constexpr numericalT power_by_int(numericalT x, int y) { numericalT result = (numericalT)1.0; while (y-- > 0) result *= x; return result; }
Ceci autorise le compilateur a compilé l'expression au moment de la compilation.
Tester le code suivant:
auto fn = estimate_function_time(factorial, 100); std::cout << "Computing fact(100)=" << fn.second << " in " << fn.first.count() << " ticks.\n"; fn = estimate_function_time([]() { return factorial(100); }); std::cout << "Computing fact(100)=" << fn.second << " in " << fn.first.count() << " ticks.\n"; auto pw = estimate_function_time(power_by_int<long double>, 1.0002, 1000000); std::cout << "Computing 1.02^1000000=" << pw.second << " in " << pw.first.count() << " ticks.\n"; pw = estimate_function_time([]() { return factorial(100); }); std::cout << "Computing 1.02^1000000=" << pw.second << " in " << pw.first.count() << " ticks.\n";
Expliquer pourquoi nous avons de telles différences entre les différentes exécutions ?
Tester le code suivant: