Легко измерьте прошедшее время

Хорошо, обнаружена ошибка новичка, во время CompleteProcessing () мне нужно вернуть мой ActionBlock вместо моего TransformBlock, так как ActionBlock - последний блок.

270
задан hap497 26 August 2013 в 23:57
поделиться

11 ответов

#include <ctime>
#include <functional>

using namespace std;

void f() {
  clock_t begin = clock();

  // ...code to measure time...

  clock_t end = clock();

  function<double(double, double)> convtime = [](clock_t begin, clock_t end)
  {
     return double(end - begin) / CLOCKS_PER_SEC;
  };

  printf("Elapsed time: %.2g sec\n", convtime(begin, end));

}

Подобный пример к одному доступному здесь, только с дополнительной функцией преобразования + распечатывают.

0
ответ дан 23 November 2019 в 02:18
поделиться

Они одинаковы, потому что ваша функция doSomething выполняется быстрее, чем гранулярность таймера. Попробуйте:

printf ("**MyProgram::before time= %ld\n", time(NULL));

for(i = 0; i < 1000; ++i) {
    doSomthing();
    doSomthingLong();
}

printf ("**MyProgram::after time= %ld\n", time(NULL));
1
ответ дан 23 November 2019 в 02:18
поделиться

функция time(NULL) вернет количество секунд, прошедших с 01/01/1970 в 00:00. И поскольку эта функция вызывается в разное время в вашей программе, она всегда будет разной Time in C++

13
ответ дан 23 November 2019 в 02:18
поделиться

Значения, выводимые вашей второй программой - это секунды и микросекунды.

0 26339 = 0.026'339 s =   26339 µs
4 45025 = 4.045'025 s = 4045025 µs
8
ответ дан 23 November 2019 в 02:18
поделиться

Вызов функции time (NULL) вернет количество секунд, прошедших с момента epoc: 1 января 1970 года. Возможно, вы имеете в виду разницу между двумя отметками времени:

size_t start = time(NULL);
doSomthing();
doSomthingLong();

printf ("**MyProgram::time elapsed= %lds\n", time(NULL) - start);
3
ответ дан 23 November 2019 в 02:18
поделиться

Только для Windows: (Тег Linux был добавлен после того, как я опубликовал этот ответ )

Вы можете использовать GetTickCount () , чтобы получить количество миллисекунд, прошедших с момента запуска системы.

long int before = GetTickCount();

// Perform time-consuming operation

long int after = GetTickCount();
31
ответ дан 23 November 2019 в 02:18
поделиться

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

#include <time.h>
#include <stdio.h>

time_t start,end;
time (&start);
.
.
.
<your code>
.
.
.
time (&end);
double dif = difftime (end,start);
printf ("Elasped time is %.2lf seconds.", dif );
56
ответ дан 23 November 2019 в 02:18
поделиться

Причина, по которой оба значения одинаковы, заключается в том, что ваша длинная процедура не занимает так много времени - менее одной секунды. Вы можете попробовать просто добавить длинный цикл (for (int i = 0; i < 100000000; i++) ; ) в конце функции, чтобы убедиться, что проблема именно в этом, а затем мы сможем продолжить...

В случае, если все вышесказанное окажется правдой, вам нужно будет найти другую системную функцию (я понимаю, что вы работаете на linux, поэтому не могу помочь вам с названием функции) для более точного измерения времени. Я уверен, что в linux есть функция, похожая на GetTickCount(), вам просто нужно найти ее.

1
ответ дан 23 November 2019 в 02:18
поделиться
#include <ctime>

void f() {
  using namespace std;
  clock_t begin = clock();

  code_to_time();

  clock_t end = clock();
  double elapsed_secs = double(end - begin) / CLOCKS_PER_SEC;
}

Функция time() точна только до секунды, но есть CLOCKS_PER_SEC "часы" в пределах секунды. Это простое, портативное измерение, хотя и слишком упрощенное.

264
ответ дан 23 November 2019 в 02:18
поделиться

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

2
ответ дан 23 November 2019 в 02:18
поделиться

time(NULL) возвращает количество секунд, прошедших с 01/01/1970 в 00:00 (эпоха). Таким образом, разница между этими двумя значениями - это количество секунд, которое заняла ваша обработка.

int t0 = time(NULL);
doSomthing();
doSomthingLong();
int t1 = time(NULL);

printf ("time = %d secs\n", t1 - t0);

Вы можете получить более тонкие результаты с помощью getttimeofday(), который возвращает текущее время в секундах, как это делает time(), а также в микросекундах.

12
ответ дан 23 November 2019 в 02:18
поделиться