I want to get the year and month from a COleDateTime object and I want it to be as fast as possible. I have 2 options;
COleDateTime my_date_time;
int year = my_date_time.GetYear();
int month = my_date_time.GetMonth();
or
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;
The question is, which would be faster?
COleDateTime
stores it's internal date representation as a DATE
typedef, and so when you call GetYear()
and GetMonth()
it has to calculate these each time. In the SYSTEMTIME
case, the values of wYear
and wMonth
are stored as DWORD
s so it is just a case of retrieving the values, but there is an overhead in converting a COleDateTime
to a SYSTEMTIME
.
Thanks,
Sterren
Thanks to the point in the right direction @MarkRansom, I tracked down the source code for COleDateTime. Here are the functions;
So
COleDateTime::GetYear()
and::GetMonth()
do the conversion toSYSTEMTIME
anyway!Since these are inline functions, these will be put in place at the call site. Since
GetAsSystemTime(st)
is common between these functions, compiler optimisation should factor out this into a temporary variable and therefore the two code snippets in my qestion are equivalent. Since option 1 is simpler, there is no reason not to go with that.Update:
Once I got the opportunity, I benchmarked the code. It looks like the compiler optimisation I was talking about does not apply to the aforementioned code. The timings for 1 million operations of either method are as follows;
Direct calls: 154ms
SYSTEMTIME method: 75ms
Well that settles it. Conversion to
SYSTEMTIME
it is.