首页 文章

直接从COleDateTime获取年份和月份或首先转换为SYSTEMTIME是否更快?

提问于
浏览
1

我想从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 s,因此只是检索值的情况,但是将 COleDateTime 转换为 SYSTEMTIME 会产生开销 .

谢谢,

星级

1 回答

  • 2

    感谢@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) 在这些函数之间很常见,因此编译器优化应将其分解为临时变量,因此我的qestion中的两个代码片段是等效的 . 由于选项1更简单,因此没有理由不这样做 .


    Update:

    一旦我有机会,我就对代码进行了基准测试 . 看起来我所讨论的编译器优化不适用于上述代码 . 两种方法的100万次操作的时间如下;

    直拨电话:154毫秒
    SYSTEMTIME方法:75ms

    那就解决了 . 转换为 SYSTEMTIME 确实如此 .

相关问题