Як уже зазначали інші, функція time () у стандартній бібліотеці С не має роздільної здатності, кращої за одну секунду. Єдиною повністю портативною функцією C, яка може забезпечити кращу роздільну здатність, є годинник (), але він вимірює час процесора, а не час настінного годинника. Якщо ви вмієте обмежувати себе платформами POSIX (наприклад, Linux), то функція clock_gettime () - хороший вибір.
Оскільки C ++ 11, існують набагато кращі умови для синхронізації які пропонують кращу роздільну здатність у формі, яка повинна бути дуже портативною для різних компіляторів та операційних систем. Аналогічно, бібліотека boost :: datetime забезпечує хороші класи часу з високою роздільною здатністю, які мають бути дуже портативними.
Одним із проблем у використанні будь-якого з цих засобів є затримка в часі, запроваджена запитом на системний годинник. Від експерименту з clock_gettime (), boost :: datetime та std :: chrono, ця затримка може легко стати справою мікросекунд. Отже, вимірюючи тривалість будь-якої частини вашого коду, потрібно дозволити наявність помилки вимірювання приблизно такого розміру або спробувати якось виправити цю нульову помилку. В ідеалі ви, можливо, захочете зібрати кілька вимірювань часу, відведеного вашою функцією, і обчислити середній, або максимальний / мінімальний час, проведений протягом багатьох циклів.
Щоб допомогти з усіма цими проблемами з портативністю та збиранням статистики, я розробляв бібліотеку cxx-rtimers, доступну в Github, яка намагається надати простий API для блоку синхронізації коду C ++, обчислення нульових помилок та звітування про статистику з декількох вбудованих таймерів. у вашому коді. Якщо у вас є компілятор C ++ 11, ви просто #include <rtimers/cxx11.hpp>
та використовуєте щось на зразок:
void expensiveFunction() {
static rtimers::cxx11::DefaultTimer timer("expensiveFunc");
auto scopedStartStop = timer.scopedStart();
// Do something costly...
}
Після виходу з програми ви отримаєте підсумок статистики хронометражу, записаного на std :: cerr, наприклад:
Timer(expensiveFunc): <t> = 6.65289us, std = 3.91685us, 3.842us <= t <= 63.257us (n=731)
який показує середній час, його стандартне відхилення, верхню та нижню межі та кількість разів, яку ця функція викликала.
Якщо ви хочете використовувати спеціальні функції синхронізації для Linux, ви можете #include <rtimers/posix.hpp>
, або якщо у вас є бібліотеки Boost, але старіший компілятор C ++, ви можете #include <rtimers/boost.hpp>
. Існують також версії цих класів таймерів, які можуть збирати статистичну інформацію про таймінг з різних потоків. Існують також методи, які дозволяють оцінити нульову помилку, пов’язану з двома негайно послідовними запитами системного годинника.
time()
повертає інше значення.