2013-07-15 3 views
2

Каков самый точный способ расчета прошедшего времени на C++? Я использовал clock(), чтобы вычислить это, но у меня такое чувство, что это неправильно, так как я получаю 0 мс 90% времени и 15 мс остальное, что не имеет для меня никакого смысла.Счетчик времени выполнения программы

Даже если он действительно маленький и очень близко к 0 мс, существует ли более точный метод, который даст мне точное значение, а не округленное значение 0 мс?

clock_t tic = clock(); 

/* 
    main programme body 
*/ 

clock_t toc = clock(); 
double time = (double)(toc-tic); 
cout << "\nTime taken: " << (1000*(time/CLOCKS_PER_SEC)) << " (ms)"; 

Благодаря

+1

Вы должны добавить операционную систему, на которой ваш код работает, как выше таймеры разрешения в основном зависимые от ОС.Если вы используете C++ 11, вы должны подумать над заголовком , который обеспечивает таймеры с более высоким разрешением и обертывает зависимости ОС. \ – ogni42

+0

Chrono также использует счетчик rdtsc? –

+0

Я запускаю XP 32 бит – user2550888

ответ

7

С C++ 11, я хотел бы использовать

#include <chrono> 
auto t0 = std::chrono::high_resolution_clock::now(); 
... 
auto t1 = std::chrono::high_resolution_clock::now(); 
auto dt = 1.e-9*std::chrono::duration_cast<std::chrono::nanoseconds>(t1-t0).count(); 

для прошедшее время в секундах.


Для предварительной 2011 C++, вы можете использовать QueryPerformanceCounter() на окнах или gettimeofday() с Linux/OSX. Например (это фактически C, а не C++):

timeval oldCount,newCount; 
gettimeofday(&oldCount, NULL); 
... 
gettimeofday(&newCount, NULL); 
double t = double(newCount.tv_sec -oldCount.tv_sec) 
     + double(newCount.tv_usec-oldCount.tv_usec) * 1.e-6; 

за прошедшее время в секундах.

+1

Кроме того, будьте осторожны с Visual Studio. –

+0

@BartekBanachewicz Я никогда не на Visual Studio. Что там не так? Не соответствует ли это стандарту? – Walter

+0

[комментарий говорит все] (http://stackoverflow.com/questions/13263277/difference-between-stdsystem-clock-and-stdsteady-clock/13266477#comment18098256_13266477) –

3

std::chrono::high_resolution_clock как портативное решение, как вы можете получить, однако он не может быть на самом деле более высокое разрешение, чем то, что вы уже видели.

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

Для более точного определения времени вам необходимо получить доступ к счетчику циклов процессора или высокоточному таймеру событий (HPET). Поставщики библиотеки компиляторов ought, чтобы использовать их для high_resolution_clock, но не все. Таким образом, вам могут понадобиться API-интерфейсы, специфичные для ОС.

(Примечание:.. Специально Visual C++ high_resolution_clock uses the low resolution system clock Но есть вероятно другие)

В Win32, например, QueryPerformanceFrequency() и QueryPerformanceCounter() функции являются хорошим выбором. Для оболочки, которая соответствует интерфейсу таймера C++ 11 и использует эти функции, см

+0

Возможно, вы захотите добавить ссылку [на этот ответ] (http://stackoverflow.com/a/13266477/752976) –

+0

@Bartek: Да, это хорошая рекомендация. –

0

Если у вас есть C++ 11, используйте библиотеку chrono.

Также различные платформы обеспечивают доступ к высокоточным часам.

Например, в linux используйте clock_gettime. В Windows используйте high performance counter api.

Пример:

C++ 11:

auto start=high_resolution_clock::now(); 
... // do stuff 
auto diff=duration_cast<milliseconds>(high_resolution_clock::now()-start); 
clog << diff.count() << "ms elapsed" << endl; 
+0

Спасибо за быстрый ответ. Я не думаю, что у меня есть C++ 11, поскольку я не могу скомпилировать этот код. Является ли chrono доступным только для C++ 11? – user2550888

+0

какой компилятор вы используете? вам может потребоваться включить поддержку C++ 11. например, используя g ++, вам нужно позвонить с помощью -std = C++ 11 или -std = C++ 0x'. – jsp