我希望从COleDateTime对象中获取年份和月份,并且希望它尽可能快。我有两个选择;
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类型定义,因此当您调用GetYear()和GetMonth()时,它每次都必须计算这些值。在SYSTEMTIME的情况下,wYear和wMonth的值被存储为DWORDs,因此这只是一个检索值的情况,但是在将COleDateTime转换为SYSTEMTIME时存在开销。
谢谢,
斯特伦
发布于 2012-06-01 16:42:59
多亏了指向正确方向的@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!
由于这些都是内联函数,因此将在调用位置放置这些函数。由于GetAsSystemTime(st)在这些函数中很常见,编译器优化应该将其分解到一个临时变量中,因此我的问题中的两个代码片段是等价的。因为选项1更简单,所以没有理由不使用它。
更新:
一旦有机会,我就对代码进行了基准测试。看起来我所说的编译器优化并不适用于上述代码。每种方法的100万次操作的时序如下;
直拨: 154ms
SYSTEMTIME方法: 75ms
好了,就这么定了。就是转换成SYSTEMTIME了。
https://stackoverflow.com/questions/10838193
复制相似问题