我想从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情况下,wYearwMonth的值存储为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是。

09-27 23:18