Последовательные операции clock () через одинаковые интервалы имеют дополнительное потребление. Зачем? - PullRequest
0 голосов
/ 01 сентября 2018

При использовании функции clock () во времени. Я заметил поведение, которое не мог объяснить. В приведенном ниже коде я использую идентичные циклы for для сокращения времени обработки. Я не вижу какой-либо логической причины, по которой один будет занимать больше времени, чем другой, но на основании того, что я вижу с помощью функции clock (), может показаться, что каждая итерация занимает примерно на 7-10% больше времени. В чем причина этого?

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

Выход:

a: 3835
b: 4155
Percentage increase in execution time: 8%
c: 4423
Percentage increase in execution time: 15%
d: 4699
Percentage increase in execution time: 22%
e: 4976
Percentage increase in execution time: 29%

Источник:

#include <ctime>
#include <iostream>

int main()
{
  clock_t a, b, c, d, e;
  unsigned int aResult, bResult, cResult, dResult, eResult;

  a = clock();
  for(int i = 0; i < 100000; i++);
  aResult = a;
  std::cout << "a: " << aResult << std::endl;

  b = clock();
  bResult = b;
  for(int i = 0; i < 100000; i++);
  std::cout << "b: " << bResult << std::endl;
  std::cout << "Percentage increase in execution time: " 
    << 100 * (bResult - aResult)/aResult << "%" <<std::endl;

  c = clock();
  for(int i = 0; i < 100000; i++);
  cResult = c;
  std::cout << "c: " << cResult << std::endl;
  std::cout << "Percentage increase in execution time: " 
    << 100 * (cResult - aResult)/aResult << "%" <<std::endl;

  d = clock();
  for(int i = 0; i < 100000; i++);
  dResult = d;
  std::cout << "d: " << dResult << std::endl;
  std::cout << "Percentage increase in execution time: " 
    << 100 * (dResult - aResult)/aResult << "%" <<std::endl;

  e = clock();
  for(int i = 0; i < 100000; i++);
  eResult = e;
  std::cout << "e: " << eResult << std::endl;
  std::cout << "Percentage increase in execution time: " 
    << 100 * (eResult - aResult)/aResult << "%" <<std::endl;
}

1 Ответ

0 голосов
/ 01 сентября 2018

Проблема в том, что вы печатаете неверную статистику. (bResult - aResult)/aResult и так далее не сообщают вам процент увеличения временных интервалов, так как aResult - это время с начала программы, а не только время цикла for. Кроме того, (dResult - aResult)/aResult и другие всегда сравнивают ваш последний результат с первым результатом, когда вам нужно сравнить его с предыдущим результатом.

Если вы измените свои выражения на форму ((eResult - dResult) - (bResult - aResult))/(bResult - aResult), вы должны получить более последовательный ответ. То есть на каждой итерации вам нужно сравнивать самый последний интервал (eResult - dResult) с первым интервалом (bResult - aResult), а не с первым.

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