Насколько точен std::chrono?

std::chrono рекламирует, что может сообщать о результатах вплоть до наносекундного уровня. На типичном компьютере x86_64 Linux или Windows, насколько точным можно ожидать этого? Каковы, например, погрешности измерения 10 нс, 10 мкс, 10 мс и 10 с?

3 ответа

Скорее всего, это зависит от оборудования и ОС. Например, когда я спрашиваю Windows, какую тактовую частоту использует QueryPerformanceFrequency(), я получаю 3903987, что, если принять обратное, вы получите тактовый период или разрешение около 256 наносекунд. Это значение, которое сообщает моя операционная система.

При использовании std:: chrono в соответствии с документами минимальная представимая длительность равна high_resolution_clock::period::num / high_resolution_clock::period::den.

Num и den являются числителем и знаменателем. std::chrono::high_resolution_clock говорит мне, что числитель равен 1, а знаменатель равен 1 миллиарду, предположительно соответствует 1 наносекунде:

std::cout << (double)std::chrono::high_resolution_clock::period::num /   
std::chrono::high_resolution_clock::period::den; // Results in a nanosecond.

Таким образом, в соответствии со стандартом std:: chrono у меня есть разрешение в одну наносекунду, но я не верю в это, потому что системный вызов нативной ОС с большей вероятностью сообщает о более точной частоте / периоде.

Точность будет зависеть от приложения и от того, как это приложение взаимодействует с операционной системой. Я не знаком с хронографом конкретно, но есть ограничения на более низком уровне, которые вы должны учитывать.

Например, если вы используете временные метки для сетевых пакетов с использованием ЦП, точность измерения очень шумная. Даже если точность измерения времени может составлять 1 наносекунду, время переключения контекста для прерывания, соответствующего прибытию пакета, может составлять ~1 микросекунда. Вы можете точно измерить, когда ваше приложение обрабатывает пакет, но не время его поступления.

Краткий ответ: нет точности в микросекундах и ниже.##

Длинный ответ: мне было интересно узнать, сколько времени требуется для выполнения моей программы с двумя dp. Поэтому я использовал хронографическую библиотеку, но когда я ее запустил, она говорит 0 микросекунд. так что технически я не мог сравнить. Я не могу увеличить размер массива, потому что его нельзя будет расширить до 1e8. Итак, я написал программу сортировки, чтобы протестировать ее, и запустил ее на 100, и вот результат:введите здесь описание изображения .

Ясно видно, что он несовместим для одного и того же ввода, поэтому я бы рекомендовал не использовать его для более высокой точности.

Другие вопросы по тегам