2012-05-31 55 views
1

我想從COleDateTime對象中獲取年份和月份,並且希望它儘可能快。我有2個選項;從COleDateTime直接獲取年份和月份或先轉換爲SYSTEMTIME會更快嗎?

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時存在開銷。

謝謝,

星級

+0

你是否在速度真正重要的環境中這樣做?如果是這樣,請對照並回來告訴我們結果。 –

+0

@MarkRansom是的,速度在代碼上下文中很重要。如果我在這裏沒有得到任何明確的解釋性答案,那麼我最終會以此爲基準。我只是希望有經驗的用戶可能知道,從COleDateTime到'SYSTEMTIME'算法的轉換比'DATE'到年份,然後是'DATE'到月份或其他方式更有效。 – Steztric

+0

老實說,你可以比任何人在這裏回覆更快。 –

回答

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)在這些函數之間是很常見的,所以編譯器優化應該將這個變成一個臨時變量,因此我的問題中的兩個代碼片段是等價的。由於選項1比較簡單,所以沒有理由不這樣做。


更新:

一旦我有機會,我爲基準的代碼。它看起來像我說的編譯器優化不適用於上述代碼。任何一種方法的100萬次操作時間如下:

直撥電話:154ms
SYSTEMTIME方法:75ms

好吧那就解決了。轉換爲SYSTEMTIME是。

+0

有趣的事情,優化。你認爲簡單的事情沒有得到優化,而那些令人難以置信的深奧的東西確實能夠管理它。很高興你明白了這一切! –

+0

的確是@MarkRansom。故事的寓意是不要假設任何東西,並依靠酸性測試 - 實際時機 - 在優化方面。 – Steztric

相關問題