Bonjour,
Je suis actuellement en train de bosser sur un programme de rendu de fractal. Je prévois quelques fonctionnalités assez complexes et l'une d'entre elle est d'avoir un indicateur en temps réel de la vitesse à laquelle la boucle principale s'exécute et l'afficher toutes les secondes ou tous les dixièmes de seconde.
La solution la plus simple est d'appeler une fonction type time()
1 à chaque itération et de faire les calculs nécessaires à partir de là. Le problème avec cette approche est que l'appel à time()
va générer un appel système qui risque d'avoir un coût non négligeable comparé à celui de l'exécution du code à l'intérieur de la boucle. Les performances étant un des points les plus critiques de mon programme.
Une autre solution serait de faire l'appel à time()
toute les x itérations, sauf que ce x n'est pas connu à l'avance et risque fort de varier durant l'exécution du programme.
Une autre solution à laquelle j'ai pensé est d'avoir un compteur incrémenté à chaque itération et d'avoir un thread séparé pour calculer la vitesse d'exécution toutes les x millisecondes. Sauf que l'itérateur doit alors être thread-safe, ce qui risque là aussi d'impacter les performances, que ce soit à cause de l'utilisation de verrou ou simplement à cause de la synchronisation des caches du processeur.
La dernière solution qui me semble faisable est d'avoir un système similaire à ma deuxième solution, mais avec une estimation dynamique du nombre d'itérations à effectuer avant d'appeler time()
pour avoir un impact négligeable sur les performances tout en ayant une estimation correcte de la vitesse d'exécution du code.
Sachant que le problème me semble quelque chose de potentiellement "courant", je suppose qu'il doit déjà y avoir une librairie qui fait ça beaucoup mieux que ce que je pourrais faire, mais je n'ai rien trouvé (en tout cas, rien avec une recherche Google et rien dans Boost), donc je me demande si mon approche est correcte.
Est-ce ça vous semble sensé?
-
oui, je sais qu'il y a des objets dédiés en C++, c'était juste pour l'exemple. ↩