Измерение времени выполнения вызова system () в C ++ - PullRequest
4 голосов
/ 28 марта 2010

Я нашел код для измерения времени выполнения здесь http://www.dreamincode.net/forums/index.php?showtopic=24685

Однако, похоже, он не работает для вызовов системы (). Я предполагаю, что это потому, что выполнение выпрыгивает из текущего процесса.

clock_t begin=clock();

system(something);

clock_t end=clock();
cout<<"Execution time: "<<diffclock(end,begin)<<" s."<<endl;

Тогда

double diffclock(clock_t clock1,clock_t clock2)
{
    double diffticks=clock1-clock2;
    double diffms=(diffticks)/(CLOCKS_PER_SEC);
    return diffms;
}

Однако это всегда возвращает 0 секунд ... Есть ли другой метод, который будет работать?

Кроме того, это в Linux.

Редактировать: Кроме того, просто чтобы добавить, время выполнения в порядке часов. Так что точность на самом деле не проблема.

Спасибо!

Ответы [ 3 ]

9 голосов
/ 28 марта 2010

Рассматривали ли вы использовать gettimeofday ?

struct timeval tv;
struct timeval start_tv;

gettimeofday(&start_tv, NULL);

system(something);

double elapsed = 0.0;

gettimeofday(&tv, NULL);
elapsed = (tv.tv_sec - start_tv.tv_sec) +
  (tv.tv_usec - start_tv.tv_usec) / 1000000.0;
6 голосов
/ 28 марта 2010

К сожалению, clock () имеет разрешение в одну секунду только в Linux (хотя и возвращает время в микросекундах).

Многие люди используют gettimeofday () для бенчмаркинга, но он измеряет прошедшее время, а не время, используемое этим процессом / потоком, поэтому не является идеальным. Очевидно, что если ваша система более или менее простаивает, а ваши тесты довольно продолжительны, вы можете усреднить результаты. Обычно меньше проблем, но все же стоит знать о том, что время, возвращаемое gettimeofday (), не является монатонным - оно может немного подскочить, например, когда ваша система впервые подключается к серверу времени NTP.

Лучшее, что нужно использовать для бенчмаркинга - это clock_gettime () с тем параметром, который больше всего подходит для вашей задачи.

  • CLOCK_THREAD_CPUTIME_ID - специфичные для потока часы времени процессора.
  • CLOCK_PROCESS_CPUTIME_ID - Таймер высокого разрешения для каждого процесса от ЦПУ.
  • CLOCK_MONOTONIC - представляет монотонное время с некоторой неопределенной начальной точки.
  • CLOCK_REALTIME - общесистемные часы реального времени.

ПРИМЕЧАНИЕ , однако, что не все параметры поддерживаются на всех платформах Linux - кроме clock_gettime (CLOCK_REALTIME), который эквивалентен gettimeofday ().

Полезная ссылка: Код профилирования с использованием clock_gettime

0 голосов
/ 28 марта 2010

Туомас Пелконен уже представил метод gettimeofday, который позволяет получать времена с разрешением до микросекунды.

В своем примере он продолжает конвертировать в удвоение. Лично я обернул структуру timeval в свой собственный класс, который сохраняет счетчики в секундах и микросекундах как целые числа и правильно обрабатывает операции добавления и минуса.

Я предпочитаю хранить целые числа (с точной математикой), а не переходить к числам с плавающей запятой и всем их бедам, когда могу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...