Что ж, для этого задания абсолютно необходимо использовать только time.h
и time.h
В этом случае измерение коротких времен затруднительно, но сделать короткое время длиннее - просто ... Просто повторяйте свой алгоритм до достижения, скажем, 1 секунды, а затем делите измеренное время на количество выполненных вами итераций. Вы можете получить искаженную картину для времени, связанного с кэшем и предиктором ветвления (поскольку повторяющиеся итерации «разогревают» кэши и обучают предиктору ветвления), но в остальном оно должно быть прилично точным.
Кстати, обратите внимание, что использование clock()
немного проблематично, так как по стандарту измеряет пользовательское процессорное время текущего процесса (поэтому время ядра и ожидание ввода-вывода исключаются), хотя в Windows оно измеряет время настенных часов. По сути, это то же самое, если ваш алгоритм связан с процессором и может работать практически непрерывно, но вы можете столкнуться с большими различиями, если он связан с вводом-выводом или работает в загруженной системе
Если вас интересует время на настенных часах, и вы ограничены time.h
, лучшим вариантом будет старый time()
; в этом случае я точно синхронизируюсь с изменением секунды с занятым ожиданием, а затем измерю количество итераций за несколько секунд, как было сказано ранее.
time_t start = time(nullptr);
while(start == time(nullptr));
start = time(nullptr);
int i = 0;
while(time(nullptr) - start < 5) {
// your algorithm
++i;
}
int elapsed = time(nullptr) - start;
double time_per_iteration = double(elapsed) / i;