我想从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
s,因此只是检索值的情况,但是将 COleDateTime
转换为 SYSTEMTIME
会产生开销 .
谢谢,
星级
1 回答
感谢@MarkRansom正确的方向,我追踪了COleDateTime的源代码 . 这是功能;
所以
COleDateTime::GetYear()
和::GetMonth()
无论如何转换为SYSTEMTIME
!由于这些是内联功能,因此这些功能将在呼叫站点上实施 . 由于
GetAsSystemTime(st)
在这些函数之间很常见,因此编译器优化应将其分解为临时变量,因此我的qestion中的两个代码片段是等效的 . 由于选项1更简单,因此没有理由不这样做 .Update:
一旦我有机会,我就对代码进行了基准测试 . 看起来我所讨论的编译器优化不适用于上述代码 . 两种方法的100万次操作的时间如下;
直拨电话:154毫秒
SYSTEMTIME方法:75ms
那就解决了 . 转换为
SYSTEMTIME
确实如此 .