我想从COleDateTime对象获取年份和月份,并且希望它尽可能快。我有2个选择;
COleDateTime my_date_time;
int year = my_date_time.GetYear();
int month = my_date_time.GetMonth();
要么
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;
问题是,哪一个会更快?
COleDateTime
将其内部日期表示形式存储为DATE
typedef,因此,当您调用GetYear()
和GetMonth()
时,每次都必须计算它们。在SYSTEMTIME
情况下,wYear
和wMonth
的值存储为DWORD
,因此只是检索值的一种情况,但是将COleDateTime
转换为SYSTEMTIME
会有开销。谢谢,
斯特伦
最佳答案
感谢正确的方向@MarkRansom,我找到了COleDateTime的源代码。这里是功能;
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;
}
所以
COleDateTime::GetYear()
和::GetMonth()
仍然可以转换为SYSTEMTIME
!由于这些是内联函数,因此将在 call 站点放置这些函数。由于
GetAsSystemTime(st)
在这些函数之间是通用的,因此编译器优化应将此因素分解为一个临时变量,因此我的问题中的两个代码段是等效的。由于选项1更简单,因此没有理由不这样做。更新:
一旦有机会,就对代码进行基准测试。我正在谈论的编译器优化似乎不适用于上述代码。每种方法进行一百万次操作的时间如下:
直拨电话:154ms
SYSTEMTIME方法:75ms
好吧,这解决了。转换为
SYSTEMTIME
是。