@JavaSscriptNoob

Как точно посчитать за какой время выполняется цикл?

Всем привет , я пытаюсь посчитать за какое время выполняется цикл на моём ПК . Но результат всегда разный может кто нибудь знает с чем может быть связанно такое поведение ?
Вот код :
#include <iostream>
#include <ctime>


clock_t startTime = clock();
int num = 610000000; // +- 1 sek 
 int  main() {
    for (int i = 0; i < num ; i++) {
        continue;
    };
    clock_t endTime = clock();
    float endTime = 1.0 * (endTime - startTime) / CLOCKS_PER_SEC;
    std::cout << "end time" << endTime ;
    return 0;
}
  • Вопрос задан
  • 177 просмотров
Решения вопроса 1
1. В зависимости от параметров сборки этот цикл может превращаться в ноль, тк в нём нет побочных эффектов (это стандарт)
2. На компьютере кроме твоей программы выполняется ещё несколько десятков других, по тому ОС будет в какие-то моменты твою программу ставить на паузу, чтобы дать процессорное время для другой программы.
3. Частота современных процессоров не постоянна, так что это тоже может влиять

Если ты хочешь написать бенчмарк, то тебе надо запустить один и тот же код несколько тысяч раз и посчитать хотябы среднее время, а в идеале ещё stddev и stderr
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Ваш цикл занимается нифига-не-деланьем - компилятор имеет полное право его выкинуть, так что такие измерения бессмысленны.
Ответ написан
@rPman
Современные процессоры с большим количеством ядер, сложной многоуровневой системой кеширования в процессоре и многозадачные операционные системы, занимающиеся чем то не особо нужным пользователям, превращают такой простой тест в рулетку.

Да, Армянское Радио правильно сказал, конкретно это код скорее всего оптимизируется до ничего неделания, так что нужно добавить хоть что то или к примеру в качестве итератора i использовать определенную глобально переменную с пометкой external (тогда компилятор ее точно не выкинет и будет добросовестно итерировать ее на единичку)

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

Что можно сделать с неодинаковыми результатами - настроить affinity для процесса на одно ядро и повысить приоритет, в этом случае шансы что процесс будет вытеснен будут минимальны... и кстати, антивирус отключи, вот уж процесс, добавляет неопределенности в машину.

p.s. попробуй собрать свой пример не в msvc а в gcc и/или clang llvm (да еще в разных операционках win/linux), результаты тебя удивят
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы