This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
td9:part2 [2021/11/06 15:14] bmonsuez [Question n°3] |
td9:part2 [2022/11/18 10:48] (current) |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ====== Partie 2 :Mesuré le temps passé par une fonction ====== | + | ====== Partie 2 : Mesurer le temps passé par une fonction ====== |
| [[in204:tds:sujets:td9|TD9]] | [[in204:tds:sujets:td9|TD9]] | ||
| Line 65: | Line 65: | ||
| ===== Question n°2 ===== | ===== Question n°2 ===== | ||
| - | Transformer la fonction précédente <code>estimate_time</code> pour qu'elle prenne en argument une fonction arbitraire qui prend un argument et retourne un résultat. | + | Transformer la fonction précédente <code>estimate_time</code> 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. | Il faudra penser à utiliser un modèle (template) de fonctions. | ||
| Line 79: | Line 79: | ||
| <code cpp> | <code cpp> | ||
| template<class Function, class T> | template<class Function, class T> | ||
| - | std::pair<std::chrono::high_resolution_clock::duration, long double> estimate_function_time(Function function, T argument) | + | auto estimate_function_time(Function function, T argument) |
| { | { | ||
| auto starting_time = std::chrono::high_resolution_clock::now(); | auto starting_time = std::chrono::high_resolution_clock::now(); | ||
| Line 96: | Line 96: | ||
| <code cpp> | <code cpp> | ||
| - | template<class T1, T2> | + | template<class numericalT> |
| - | T1 power(T2 x, int y) | + | numericalT power_by_int(numericalT x, int y) |
| { | { | ||
| - | T1 result = (T1)1.0 | + | numericalT result = (numericalT)1.0; |
| - | while(y-- > 0) | + | while (y-- > 0) |
| - | result = result * (T1)x; | + | result *= x; |
| - | return result; | + | return result; |
| } | } | ||
| </code> | </code> | ||
| Line 114: | Line 114: | ||
| template<class Function, class ... Args> | template<class Function, class ... Args> | ||
| - | std::pair<std::chrono::high_resolution_clock::duration, long double> estimate_function_time(Function function, Args... arguments) | + | auto estimate_function_time(Function function, Args... arguments) |
| { | { | ||
| auto starting_time = std::chrono::high_resolution_clock::now(); | auto starting_time = std::chrono::high_resolution_clock::now(); | ||
| Line 124: | Line 124: | ||
| </hidden> | </hidden> | ||
| - | Estimer le temps nécesaire pour calculer par exemple : 1.02 ^ 10000000. | + | Estimer le temps nécesaire pour calculer par exemple : 1.0002 ^ 10000000. |
| <hidden Correction> | <hidden Correction> | ||
| Line 140: | Line 140: | ||
| ==== Question n°5 ==== | ==== Question n°5 ==== | ||
| - | Créer une fonction nouvelle qui va appeller la fonction <code>estimate_time</code> pour calculer <code>x</code> fois le temps et retourné le temps moyen pour effectuer un "run" de la fonction. | + | 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. |
| - | Exécuter cette fonction pour les fonctions <code>power</code> et <code>factorial</code> précédemment définie. | ||
| - | ==== Question n°4 ==== | + | Cette fonction aura l'entête suivante : |
| - | Que faut-il faire ajouter pour dire au compilateur que la fonction <code>factorial</code> ou que la fonction <code>power</code> peut-être exécutée au moment de l'exécution ? | + | <code cpp> |
| + | template<class Function, class ... Args> | ||
| + | long long mean_function_time(int number_of_runs, Function function, Args... arguments) | ||
| + | { | ||
| + | ... | ||
| + | } | ||
| + | </code> | ||
| - | Effectuer la modification. | + | <hidden Correction> |
| + | |||
| + | Il suffit de lancer ''number_of_runs'' fois un appel à ''estimate_function_time'' pour la fonction et les arguments. Ceci donne le code suivant : | ||
| + | |||
| + | <code cpp> | ||
| + | template<class Function, class ... Args> | ||
| + | long long mean_function_time(int number_of_runs, Function function, Args... arguments) | ||
| + | { | ||
| + | long long duration = 0L; | ||
| + | int remaining_runs = number_of_runs; | ||
| + | while (remaining_runs-- > 0) | ||
| + | duration += estimate_function_time(function, arguments...).first.count(); | ||
| + | return duration / (long long)number_of_runs; | ||
| + | } | ||
| + | </code> | ||
| + | |||
| + | </hidden> | ||
| - | Calculer le temps pris désormais par ces fonctions. | ||
| + | [[.td9:part1|Manipuler un nombre variable de paramètres]] | ||
| + | [[.td9:part3|Exécution à la compilation]] | ||