Замерить время работы функции на С++

      Комментарии к записи Замерить время работы функции на С++ отключены

Главная Форумы Программирование Программирование на С++ Замерить время работы функции на С++

Помечено: , , , ,

В этой теме 2 ответа, 2 участника, последнее обновление  Васильев Владимир Сергеевич 5 мес., 3 нед. назад.

  • Автор
    Сообщения
  • #2969

    questioner
    Участник

    Мне нужно замерить время выполнения фрагмента кода (можно функции) на С++.

    Я прочитал, что для этого используется clock() из модуля time.h (ctime) – она возвращает число таков, измеряемое процессором от начала выполнения программы.
    Глобальная константа CLOCKS_PER_SEC хранит число тактов, выполняемое процессором в секунду. Соответственно, чтобы получить время работы программы в секундах достаточно результат работы функции разделить на эту константу:
    clock() / CLOCKS_PER_SEC;

    Для определения времени работы фрагмента программы нужно определить моменты времени до фрагмента и после него, а затем – посчитать разницу. Однако следующий фрагмент кода работает не так, как мне хотелось бы:

    #include <stdio .h> 
    #include <time .h> 
    
    int main() {
      clock_t start = clock();
    
      getchar(); 
    
      clock_t end = clock();
      double seconds = (double)(end - start) / CLOCKS_PER_SEC;
    
      printf("The time: %f seconds\n", seconds);
    }

    В данном случае я надеюсь получить время, которое пользователь тратит на нажатие клавиши, однако вне зависимости от того, как долго я жду – результат получается примерно одинаковый, а время очень маленьким (см. скриншот). Хотя, если вместо getchar я ставлю фрагмент кода, выполняющий какие-либо вычисления – выводится правдоподобный результат.

    Подскажите в чем проблема и как ее решить.

    Вложения:
  • #2971

    Функция clock() возвращает количество тиков процессора, которое сделала именно ваша программа, т.е. если программа ожидает ввод данных пользователем, то она не работает (операционная система вытесняет процесс из очереди задач). Следовательно нельзя замерить время ожидания ввода при помощи функции clock() – хотя подход, который вы привели, идеально подходит если вы хотите сравнить два алгоритма, т.к. в этом случае меньшее влияние оказывает загруженность системы.

    Определить количество секунд, которое выполняется программа можно с помощью функции time():

    #include <stdio .h> 
    #include <time .h> 
    
    int main() {
      time_t start, end;
      
      time(&start);
    
      getchar(); 
    
      time(&end);
      
      double seconds = difftime(end, start);
    
      printf("The time: %f seconds\n", seconds);
    }

    Время при этом сохраняет с типом данных time_t – это целое число секунд, прошедшее с 1 января 1970 года. Функция difftime вычисляет разницу двух моментов времени. С помощью такого подхода вы сможете замерить время работы части программы, однако результат будет в секундах.

  • #2974

    При помощи средств, появившихся в стандартной библиотеке С++11 можно получить более высокую точность измерения и замерить время независимо от системных часов (с помощью так называемых стабильных часов). Обзор библиотеки chrono.

    Следующий фрагмент кода выполняет замер времени с использованием стабильных часов:

    #include <iostream>
    #include <chrono>
    
    int main() {
      auto begin = std::chrono::steady_clock::now();
    
      getchar(); 
    
      auto end = std::chrono::steady_clock::now();
      
      auto elapsed_ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin);
    
      std::cout << "The time: " << elapsed_ms.count() << " ms\n";
    }

    Функция std::chrono::duration_cast преобразует объект типа <code>time_point во временной интервал (duration), при этом в качестве параметра шаблона передается промежуток времени в виде долей секунды (в данном случае миллисекунды).

    Использование библиотеки chrono – лучший способ если нужно фактическое замерить время выполнения программы (в отличии функции time(), модуля time.h она позволяет получить время в миллисекундах и даже наносекундах). Однако если программа работает на многопроцессорной системе и часто ожидает какие-либо данные (не только пользовательский ввод, но и данных от других потоков/процессов) – то больший интерес может представлять реальное время выполнения, возвращаемое функцией clock() модуля time.h. Реальное время лучше отражает потребляемый ресурс процессора, т.к. если текущий процесс простаивает на кластере (где выполняются сотни других приложений), то он вытесняется операционной системой и практически не загружает процессор.

Для ответа в этой теме необходимо авторизоваться.