This is an old revision of the document!
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 <= 1 ? 1 : (n * factorial(n - 1)); }
La fonction aura le squelette suivant:
int estimate_time(int n) { // Code pour lancer le chronomètre int result = factorial(n); // Code pour calculer le temps écoulé et affiché celui-ci. return result; }
Transformer la fonction précédente
estimate_time
pour qu'elle prenne en argument une fonction arbitraire à un argument et un résultat.
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 T1, T2> T1 power(T2 x, int y) { T1 result = (T1)1.0 while(y-- > 0) result = result * (T1)x; return result; }
Modifier le code de la fonction pour pouvoir prendre une telle fonction comme paramètre.
Estimer le temps nécesaire pour calculer par exemple : 1.02 ^ 10000000.
Créer une fonction nouvelle qui va appeller la fonction
estimate_time
pour calculer
x
fois le temps et retourné le temps moyen pour effectuer un “run” de la fonction.
Exécuter cette fonction pour les fonctions
power
et
factorial
précédemment définie.
Que faut-il faire ajouter pour dire au compilateur que la fonction
factorial
ou que la fonction
power
peut-être exécutée au moment de l'exécution ?
Effectuer la modification.
Calculer le temps pris désormais par ces fonctions.