Время работы одной и той же программы сильно варьируется, иногда достигая 1000+ с нами. - PullRequest
0 голосов
/ 06 октября 2019
#include <stdio.h>
#include <stdarg.h>
#include <sys/time.h>

char kBuff[1024];
const char* kMsg = "0123456789 abcdefghizklmnopqrstuvwxyz ABCDEFGHIJKLMNOPQRSTUVWXYZ";
const long kThreshold = 100; //us

void func(const char* fmt, ...) {  
  struct timeval start, end;
  gettimeofday(&start, NULL);

  va_list ap;
  va_start (ap, fmt);
  vsnprintf(kBuff, sizeof(kBuff) - 1, fmt, ap);
  va_end (ap);

  gettimeofday(&end, NULL);

  long during = (end.tv_sec - start.tv_sec) * 1000 * 1000 + (end.tv_usec - start.tv_usec);
  if (during > kThreshold)
    printf("%ld, ", during);
}

int main() {
  long index = 0;
  for(int i = 0; i < 1000000; i++) {
    func("Index:%8ld Msg:%s", index++, kMsg);
  }
}

Я запускаю довольно простой код 10 000 000 раз, и иногда время выполнения конкретного фрагмента кода сильно варьируется, иногда достигая 1000 + нас. Результат ниже:

105, 106, 135, 115, 121, 664, 135, 1024, 165, 130,

Программа работает в виртуальноймашина Ubuntu-18.04 на Windows-10

g ++ -ggdb -O2 test.cpp

gettimeofday(&start, NULL);

va_list ap;
va_start (ap, fmt);
vsnprintf(kBuff, sizeof(kBuff) - 1, fmt, ap);
va_end (ap);

gettimeofday(&end, NULL);

Приведенный выше код не попадает в ядро ​​и неwait I / O, не ждет блокировок, так почему время выполнения может достигать 1000 мкс?

Одна из причин, которую я догадался, была из-за планирования операционной системы. но как мне доказать это?

Если в этом причина, то как я могу точно измерить время работы программы?

1 Ответ

2 голосов
/ 06 октября 2019

Измерение производительности просто с использованием настенных часов часто неадекватно по нескольким причинам, таким как

  1. ОС может планировать другие процессы в ЦП (как вы упомянули)
  2. Вы не можете измерятьто, что вы на самом деле пытаетесь измерить из-за возможного переупорядочения компилятора ( Обязательный порядок операторов в C ++ обсуждает это подробно)
  3. Подпрограммы, которые измеряют время (gettimeofday в вашем случае) сами по себе имеют накладные расходыкоторые могут быть включены в ваше измерение, таким образом внося шум

Существуют такие инструменты, как perf tool , которые используют счетчики производительности и точки трассировки дляпроанализируйте производительность без этих проблем.

Я считаю https://www.youtube.com/watch?v=nXaxk27zwlk хорошей отправной точкой, чтобы научиться тестировать. В нем обсуждается использование google benchmark и perf, полезных для измерения производительности.

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

...