Быстрее получить год и месяц напрямую из COleDateTime или сначала преобразовать в SYSTEMTIME?
Я хочу получить год и месяц от объекта 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. Вот функции;
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 проще, нет причин не соглашаться с этим.
Обновить:
Как только у меня появилась возможность, я сравнил код. Похоже, что оптимизация компилятора, о которой я говорил, не относится к вышеупомянутому коду. Сроки для 1 миллиона операций любого способа следующие;
Прямые звонки: 154мс
СИСТЕМНЫЙ метод: 75 мс
Ну, это решает вопрос. Преобразование в SYSTEMTIME
это.