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内部の日付表現をDATEtypedefとして格納するため、を呼び出すGetYear()と、GetMonth()毎回これらを計算する必要があります。このSYSTEMTIME場合、との値はwYearswMonthとして格納されるDWORDため、値を取得する場合にすぎませんが、COleDateTimeaを。に変換する際にオーバーヘッドが発生しSYSTEMTIMEます。

ありがとう、

スターレン

4

1 に答える 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)、コンパイラの最適化はこれを一時変数に分解する必要があります。したがって、私の質問の2つのコードスニペットは同等です。オプション1の方が単純なので、それを採用しない理由はありません。


アップデート:

機会があれば、コードのベンチマークを行いました。私が話していたコンパイラの最適化は、前述のコードには適用されないようです。いずれかの方法で100万回の操作を行うタイミングは以下のとおりです。

直接呼び出し:154ms
SYSTEMTIMEメソッド:75ms

まあそれはそれを解決します。それへの変換SYSTEMTIMEです。

于 2012-06-01T08:42:59.177 に答える