Arcane  v3.14.10.0
Documentation utilisateur
Chargement...
Recherche...
Aucune correspondance
Timer.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2022 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* Timer.h (C) 2000-2022 */
9/* */
10/* Gestion d'un timer. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_TIMER_H
13#define ARCANE_TIMER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/String.h"
18
19#include "arcane/ArcaneTypes.h"
20
21/*---------------------------------------------------------------------------*/
22/*---------------------------------------------------------------------------*/
23
24namespace Arcane
25{
26
27/*---------------------------------------------------------------------------*/
28/*---------------------------------------------------------------------------*/
29
30class ITimerMng;
31class ITimeStats;
32
33/*---------------------------------------------------------------------------*/
34/*---------------------------------------------------------------------------*/
35/*!
36 * \brief Gestion d'un timer.
37
38 * Une instance de cette classe permet de mesurer le temps passé entre son
39 * activation par la méthode start() et son arrêt par la méthode stop().
40
41 * Le timer peut être utilisé plusieurs fois et il est possible de
42 * connaître à la fois le nombre d'activation (nbActivated()) et le temps
43 * total passé dans ses activations successives (totalTime()).
44
45 * Il existe deux modes de fonctionnement:
46 * <ul>
47 * <li>#TimerVirtual: le timer utilise le temps CPU du processus. Ce temps
48 * est constant quelle que soit la charge de la machine;</li>
49 * <li>#TimerReal: le timer utilise le temps réel. La résolution de ce timer est
50 * en général meilleure qu'avec le type précédent mais elle n'est significative
51 * que lorsque la machine est dédiée au processus.</li>
52 * </ul>
53 *
54 * \note Depuis la version 3.6 de %Arcane, le #TimerVirtual est obsolète et
55 * la valeur retournée sera équivalent à #TimerReal.
56 *
57* La résolution du timer dépend de la machine. Elle est de l'ordre de la
58 * milliseconde pour les timers utilisant le temps CPU et de l'ordre de
59 * la microseconde pour les timers utilisant le temps réel.
60 */
61class ARCANE_CORE_EXPORT Timer
62{
63 public:
64
65 //! Type du timer
67 {
68 /*!
69 * \brief Timer utilisant le temps CPU (obsolète).
70 *
71 * \deprecated Ce timer n'est plus utilisé et se comporte comme
72 * le temps horloge (TimerReal).
73 */
75 //! Timer utilisant le temps réel
76 TimerReal
77 };
78
79 public:
80
81 /*!
82 * \brief Sentinelle pour le timer.
83 * La sentinelle associée à un timer permet de déclancher celui-ci
84 * au moment de sa construction et de l'arrêter au moment de sa
85 * destruction. Cela assure que le timer sera bien arrêté en cas
86 * d'exception par exemple.
87 */
88 class ARCANE_CORE_EXPORT Sentry
89 {
90 public:
91 //! Associe le timer \a t et le démarre
92 Sentry(Timer* t) : m_timer(t)
93 { m_timer->start(); }
94 //! Stoppe le timer associé
96 { m_timer->stop(); }
97 private:
98 Timer* m_timer; //!< Timer associé
99 };
100
101 /*!
102 * \brief Postionne le nom de l'action en cours d'exécution.
103 *
104 * Le nom d'une action peut-être n'importe quoi. Il est
105 * juste utilisé pour différencier les différentes partie d'une
106 * exécution et connaître le temps de chacune d'elle.
107 * Les actions doivent s'imbriquent les unes dans les autres
108 */
109 class ARCANE_CORE_EXPORT Action
110 {
111 public:
112 Action(ISubDomain* sub_domain,const String& action_name,bool print_time=false);
113 Action(ITimeStats* stats,const String& action_name,bool print_time=false);
114 ~Action();
115 public:
116 private:
117 ITimeStats* m_stats;
118 String m_action_name;
119 bool m_print_time;
120 private:
121 void _init();
122 };
123
124 /*!
125 * \brief Positionne la phase de l'action en cours d'exécution.
126 */
127 class ARCANE_CORE_EXPORT Phase
128 {
129 public:
130 public:
131 Phase(ISubDomain* sub_domain,eTimePhase pt);
132 Phase(ITimeStats* stats,eTimePhase pt);
133 ~Phase();
134 public:
135 private:
136 ITimeStats* m_stats; //!< Gestionnaire de sous-domaine
137 eTimePhase m_phase_type;
138 private:
139 void _init();
140 };
141
142 /*!
143 * \brief Affiche le temps passé entre l'appel au constructeur et le destructeur.
144 *
145 * Cette classe permet de simplement afficher au moment du destructeur,
146 * le temps réel écoulé depuis l'appel au constructeur. L'affichage se fait
147 * via la méthode info() du ITraceMng.
148 * \code
149 * {
150 * Timer::SimplePrinter sp(traceMng(),"myFunction");
151 * myFunction();
152 * }
153 * \endcode
154 */
155 class ARCANE_CORE_EXPORT SimplePrinter
156 {
157 public:
158 SimplePrinter(ITraceMng* tm,const String& msg);
159 SimplePrinter(ITraceMng* tm,const String& msg,bool is_active);
161 private:
162 ITraceMng* m_trace_mng;
163 Real m_begin_time;
164 bool m_is_active;
165 String m_message;
166 private:
167 void _init();
168 };
169
170 public:
171
172 /*!
173 * \brief Construit un timer.
174 *
175 * Construit un timer lié au sous-domaine \a sd, de nom \a name et de
176 * type \a type.
177 */
178 Timer(ISubDomain* sd,const String& name,eTimerType type);
179
180 /*!
181 * \brief Construit un timer.
182 *
183 * Construit un timer lié au gestionnaire \a tm, de nom \a name et de
184 * type \a type.
185 */
186 Timer(ITimerMng* tm,const String& name,eTimerType type);
187
188 ~Timer(); //!< Libère les ressources
189
190 public:
191
192 /*!
193 * \brief Active le timer.
194 *
195 * Si le timer est déjà actif, cette méthode ne fait rien.
196 */
197 void start();
198
199 /*!
200 * \brief Désactive le timer.
201 *
202 * Si le timer n'est pas actif au moment de l'appel, cette méthode ne
203 * fait rien.
204 *
205 * \return le temps écoulé (en secondes) depuis la dernière activation.
206 */
207 Real stop();
208
209 //! Retourne l'état d'activation du timer
210 bool isActivated() const { return m_is_activated; }
211
212 //! Retourne le nom du timer
213 const String& name() const { return m_name; }
214
215 //! Retourne le temps total (en secondes) passé dans le timer
216 Real totalTime() const { return m_total_time; }
217
218 //! Retourne le temps (en secondes) passé lors de la dernière activation du timer
219 Real lastActivationTime() const { return m_activation_time; }
220
221 //! Retourne le nombre de fois que le timer a été activé
222 Integer nbActivated() const { return m_nb_activated; }
223
224 //! Retourne le type du temps utilisé
225 eTimerType type() const { return m_type; }
226
227 //! Remet à zéro les compteurs de temps
228 void reset();
229
230 //! Gestionnaire associé à ce timer.
231 ITimerMng* timerMng() const { return m_timer_mng; }
232 public:
233 static TimeMetricAction phaseAction(ITimeStats* s,eTimePhase phase);
234 public:
235 //! \internal
236 void _setStartTime(Real t) { m_start_time = t; }
237 //! \internal
238 Real _startTime() const { return m_start_time; }
239 private:
240
241 ITimerMng* m_timer_mng; //!< Gestionnaire de timer
242 eTimerType m_type; //!< Type du timer
243 Integer m_nb_activated; //!< Nombre de fois que le timer a été activé
244 bool m_is_activated; //!< \a true si le timer est actif
245 Real m_activation_time; //!< Temps passé lors de la dernière activation
246 Real m_total_time; //!< Temps total passé dans le timer
247 String m_name; //!< Nom du timer
248 Real m_start_time; //!< Temps du début de la dernière activation
249};
250
251/*---------------------------------------------------------------------------*/
252/*---------------------------------------------------------------------------*/
253
254} // End namespace Arcane
255
256/*---------------------------------------------------------------------------*/
257/*---------------------------------------------------------------------------*/
258
259#endif
260
Interface du gestionnaire d'un sous-domaine.
Definition ISubDomain.h:74
Interface d'un gestionnaire de timer.
Definition ITimerMng.h:53
Postionne le nom de l'action en cours d'exécution.
Definition Timer.h:110
Positionne la phase de l'action en cours d'exécution.
Definition Timer.h:128
Sentinelle pour le timer. La sentinelle associée à un timer permet de déclancher celui-ci au moment d...
Definition Timer.h:89
Sentry(Timer *t)
Associe le timer t et le démarre.
Definition Timer.h:92
~Sentry()
Stoppe le timer associé
Definition Timer.h:95
Affiche le temps passé entre l'appel au constructeur et le destructeur.
Definition Timer.h:156
Gestion d'un timer.
Definition Timer.h:62
const String & name() const
Retourne le nom du timer.
Definition Timer.h:213
Integer nbActivated() const
Retourne le nombre de fois que le timer a été activé
Definition Timer.h:222
ITimerMng * timerMng() const
Gestionnaire associé à ce timer.
Definition Timer.h:231
eTimerType
Type du timer.
Definition Timer.h:67
@ TimerVirtual
Timer utilisant le temps CPU (obsolète).
Definition Timer.h:74
eTimerType type() const
Retourne le type du temps utilisé
Definition Timer.h:225
Real totalTime() const
Retourne le temps total (en secondes) passé dans le timer.
Definition Timer.h:216
bool isActivated() const
Retourne l'état d'activation du timer.
Definition Timer.h:210
Real lastActivationTime() const
Retourne le temps (en secondes) passé lors de la dernière activation du timer.
Definition Timer.h:219
Interface du gestionnaire de traces.
Chaîne de caractères unicode.
-*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
eTimePhase
Phase d'une action temporelle.
double Real
Type représentant un réel.
Int32 Integer
Type représentant un entier.