Всякий раз, когда я звоню:
std::chrono::high_resolution_clock::now().time_since_epoch().count();
Инструкция по сборке для него такая:
std::chrono::high_resolution_clock::now().time_since_epoch().count();
00007FF7D9E11840 call qword ptr [__imp__Query_perf_frequency (07FF7D9E14090h)]
00007FF7D9E11846 call qword ptr [__imp__Query_perf_counter (07FF7D9E140A0h)]
Раньше я использовал часы Windows API и думал, что правильный способ - один раз запросить частоту.
В документации Microsoft говорится:
QueryPerformanceFrequency Получает частоту счетчика производительности. Частота счетчика производительности фиксируется при загрузке системы и одинакова для всех процессоров. Поэтому частоту нужно запрашивать только при инициализации приложения, а результат можно кэшировать.
Это было в цикле, поэтому я думаю, что вызов QueryPerformanceFrequency выполняется неоднократно. Это строилось в режиме Release и с оптимизацией /O2.
Кроме того, если я создам в режиме отладки, он сделает следующую сборку:
std::chrono::high_resolution_clock::now().time_since_epoch().count();
00007FF774FC9D19 lea rcx,[rbp+398h]
00007FF774FC9D20 call std::chrono::steady_clock::now (07FF774FB1226h)
00007FF774FC9D25 lea rdx,[rbp+3B8h]
00007FF774FC9D2C mov rcx,rax
00007FF774FC9D2F call std::chrono::time_point<std::chrono::steady_clock,std::chrono::duration<__int64,std::ratio<1,1000000000> > >::time_since_epoch (07FF774FB143Dh)
00007FF774FC9D34 mov rcx,rax
00007FF774FC9D37 call std::chrono::duration<__int64,std::ratio<1,1000000000> >::count (07FF774FB1361h)
Я не разбираюсь в ассемблере и не знаю, почему в режиме Release есть вызовы Windows API, а в режиме Debug об этом не упоминается. Кроме того, я на Visual Studio.
Спасибо.
QueryPerformanceFrequency
всего один, где второй? - person Rakete1111   schedule 27.12.2016