2012-05-31 1 views
1

Je veux obtenir l'année et le mois d'un objet COleDateTime et je veux qu'il soit aussi rapide que possible. J'ai 2 options;Est-il plus rapide d'obtenir l'année et le mois directement à partir de COleDateTime ou de convertir en SYSTEMTIME en premier?

COleDateTime my_date_time; 
int year = my_date_time.GetYear(); 
int month = my_date_time.GetMonth(); 

ou

COleDateTime my_date_time; 
SYSTEMTIME mydt_as_systemtime; 
my_date_time.GetAsSystemTime(mydt_as_systemtime); 
int year = mydt_as_systemtime.wYear; 
int month = mydt_as_systemtime.wMonth; 

La question est, ce qui serait plus rapide?

COleDateTime stocke sa représentation de date interne comme DATE typedef, et donc quand vous appelez GetYear() et GetMonth() il doit calculer ces chaque fois. Dans le cas SYSTEMTIME, les valeurs de wYear et wMonth sont stockées sous la forme DWORD s, il s'agit donc simplement de récupérer les valeurs, mais il existe un surcoût lors de la conversion d'un COleDateTime en SYSTEMTIME.

Merci,

Sterren

+0

Faites-vous cela dans un contexte où la vitesse compte vraiment? Si c'est le cas, comparez les deux et revenez nous dire le résultat. –

+0

@MarkRansom Oui, la vitesse est importante dans le contexte du code. Si je ne reçois pas de réponse explicative ici, je finirai par l'évaluer. J'ai juste espéré qu'un utilisateur expérimenté sache que la conversion de l'algorithme 'COleDateTime' en' SYSTEMTIME' est plus efficace que le 'DATE' à l'année et ensuite' DATE' au mois ou à d'autres. – Steztric

+0

Honnêtement, vous pouvez banc ce plus rapidement que quiconque ici peut répondre. –

Répondre

2

Merci au point dans la bonne direction @MarkRansom, je traqués le code source pour COleDateTime. Voici les fonctions;

ATLCOMTIME_INLINE int COleDateTime::GetYear() const throw() 
{ 
    SYSTEMTIME st; 
    return GetAsSystemTime(st) ? st.wYear : error; 
} 

ATLCOMTIME_INLINE int COleDateTime::GetMonth() const throw() 
{ 
    SYSTEMTIME st; 
    return GetAsSystemTime(st) ? st.wMonth : error; 
} 

Alors COleDateTime::GetYear() et ::GetMonth() faire la conversion en SYSTEMTIME de toute façon!

Puisqu'il s'agit de fonctions en ligne, celles-ci seront mises en place sur le site d'appel. Puisque GetAsSystemTime(st) est commun entre ces fonctions, l'optimisation du compilateur devrait factoriser cela dans une variable temporaire et donc les deux extraits de code dans ma requête sont équivalents. Depuis l'option 1 est plus simple, il n'y a aucune raison de ne pas aller avec cela.


Mise à jour:

Une fois que j'ai eu l'occasion, je benchmarkée le code. Il semble que l'optimisation du compilateur dont je parlais ne s'applique pas au code mentionné ci-dessus. Les délais pour 1 million d'opérations de l'une ou l'autre méthode sont les suivants;

appels directs: 154ms
méthode SYSTEMTIME: 75ms

Eh bien cela règle. Conversion à SYSTEMTIME c'est.

+0

Chose amusante, optimisation. Les choses que vous pensez simples ne sont pas optimisées, et les choses incroyablement ésotériques le gèrent. Je suis content que vous ayez tout compris! –

+0

En effet @MarkRansom. La morale de l'histoire est de ne rien supposer et compter sur le test de l'acide - les délais réels - quand il s'agit d'optimisation. – Steztric

Questions connexes