Знайте, если процессор поддерживает наносекунды - PullRequest
1 голос
/ 23 марта 2020

Я пытаюсь получить истекшее время в наносекундах, используя C ++ в visual studio. Я провел некоторое тестирование, и измерения всегда заканчиваются на 00. Значит ли это, что мой процессор (Ryzen 7-1800X) не поддерживает разрешение ~ 1 наносекунда, а всего ~ 100 нс? Можно ли как-нибудь включить?

auto start = std::chrono::high_resolution_clock::now();    
for (int i = 0; i < 10; i++) {
    //stuff
    auto elapsed = std::chrono::high_resolution_clock::now() - start;
    long long nanoseconds = std::chrono::duration_cast<std::chrono::nanoseconds>(elapsed).count();
    std::cout << "\n" << nanoseconds << "\n";
}

1 Ответ

2 голосов
/ 23 марта 2020

В MSV C 2015+ std::chrono::high_resolution_clock основан на QueryPerformanceCounter, который имеет разрешение 100 нс.

При Windows, QueryPerformanceCounter - самый быстрый таймер пользовательского пространства. Если вам нужно еще более высокое разрешение, вы можете попробовать инструкцию RDTS C (__rdtsc), которая возвращает счетчик циклов ЦП. Но это очень хитрый для правильного использования и не рекомендуется.

Кажется, на Windows вы в значительной степени застряли в разрешении 100 нс. Имейте в виду, что в мире Windows 100 нс - очень короткое время - примерно 300 инструкций. Всего один вызов QueryPerformanceCounter уже занимает около 1000 инструкций.

...