Nous souhaitons mesurer le temps de calcul d'une fonction. Pour ce faire, nous souhaitons créer une fonction : - qui va prendre en argument la fonction que nous souhaitons exécuter, - les arguments que nous devons passer à cette fonction, - qui va lancer un chronomètre, - qui va lancer la fonction - qui va récupérer le résultat de la fonction, - qui va estimer le temps passé par le temps de la fonction, - qui va retourner à la fois le résultat de la fonction mais aussi le temps passé par la fonction.
Pour simplifier la conception, écrivez dans un premier la fonction qui appelle la fonction factorielle qui suit: et qui va exécuter cette fonction
int factorial(int n) { return n == 0 ? 1 : (n * factorial(n - 1)); }
La fonction aura le squelette suivant:
std::pair<std::chrono::high_resolution_clock::duration, int> estimate_factorial_time(int n) { // Code pour lancer le chronomètre int result = factorial(n); // Code pour calculer le temps écoulé // Retourner la paire contenant le résultat et le temps passé. }
Transformer la fonction précédente
estimate_time
pour qu'elle prenne en argument une fonction arbitraire qui prend un argument et retourne un résultat qui ne sera pas obligatoirement un résultat de type long double
.
Il faudra penser à utiliser un modèle (template) de fonctions.
Nous souhaitons désormais pouvoir prendre une fonction pouvant prendre plusieurs arguments comme la fonction puissance.
template<class numericalT> numericalT power_by_int(numericalT x, int y) { numericalT result = (numericalT)1.0; while (y-- > 0) result *= x; return result; }
Modifier le code de la fonction pour pouvoir prendre une telle fonction comme paramètre.
Remarque: il faut penser à utiliser les packs de paramètres que nous avons vu dans la première partie du TD.
Estimer le temps nécesaire pour calculer par exemple : 1.0002 ^ 10000000.
Créer une fonction nouvelle qui va appeller la fonction estimate_function_time
pour calculer x
fois le temps nécessaire pour calculer la fonction et qui retourn le temps moyen pour effectuer un “run” de la fonction.
Cette fonction aura l'entête suivante :
template<class Function, class ... Args> long long mean_function_time(int number_of_runs, Function function, Args... arguments) { ... }