Расчет времени по коду C++
Я знаю, что этот вопрос задавался несколько раз в SO, но никто из них действительно не помогает мне, поэтому спрашиваю снова.
Я использую Windows XP и запускаю Visual Studio C++ 2008.
Весь код, который я просматриваю, использует time.h, но я думаю, что здесь он работает неправильно, потому что результаты делают меня подозрительным.
Так что это то, что я хочу.
star time = get time some how (this is my question)
my code
end time = get time some how (this is my question)
time passed = start time - end time
7 ответов
Вот что я использую для печати времени в миллисекундах.
void StartTimer( _int64 *pt1 )
{
QueryPerformanceCounter( (LARGE_INTEGER*)pt1 );
}
double StopTimer( _int64 t1 )
{
_int64 t2, ldFreq;
QueryPerformanceCounter( (LARGE_INTEGER*)&t2 );
QueryPerformanceFrequency( (LARGE_INTEGER*)&ldFreq );
return ((double)( t2 - t1 ) / (double)ldFreq) * 1000.0;
}
Используйте это так:
_int64 t1;
StartTimer( &t1 );
// do some stuff
printf( "Time = %.3f\n", StopTimer( t1 ));
Вам нужен высокоточный таймер. В случае Visual Studio используйте QueryPerformanceCounter.
Если точность все еще недостаточна, используйте интристику компилятора:
#include <intrin.h>
#pragma intrinsic(__rdtsc)
unsigned __int64 ticks = __rdtsc();
Смотрите информацию об этом интристике здесь.
Оба решения предназначены только для Windows, последнее, вероятно, только MSVC. Я могу опубликовать аналогичное решение для GCC/Linux, если это необходимо.
Если вы на Windows, то GetTickCount()
Функция - это удобный способ получить таймер с большим разрешением, чем 1 секунда. Разрешение GetTickCount
зависит от вашей операционной системы, но это, вероятно, где-то между 10 мс и 16 мс.
Обратите внимание, что для быстрых операций однократного выполнения кода недостаточно. Ваш код может работать как 0,02 мс, что означает, что вы получите 0 от счетчика, такого как GetTickCount
, Ваш код может не выполняться достаточно долго, чтобы таймер мог перейти к следующему значению. Решение состоит в том, чтобы запустить ваш код в цикле миллион раз или что-то еще, потратить время на все, а затем разделить на миллион.
Обычно люди делают что-то подобное, чтобы измерить небольшой интервал времени:
t0 = getTime();
for(int i = 0; i<1000000; ++i) {
your code
}
t1 = getTime();
timePassed = (t1-t0)/1000000;
Это работает
#include <windows.h>
SYSTEMTIME startTime;
GetSystemTime(&startTime);
WORD startmillis = (startTime.wSecond * 1000) + startTime.wMilliseconds;
// Do some stuff
SYSTEMTIME endTime;
GetSystemTime(&endTime);
WORD endmillis = (endTime.wSecond * 1000) + endTime.wMilliseconds;
WORD millis = startmillis - endmillis ;
Вот портативная, автономная, короткая реализация именно того, что вам нужно: http://cplusplus.co.il/2009/08/19/portable-measurement-of-execution-time/
Если разрешение недостаточно хорошее, вы должны выполнить тест пару раз.
Предложение Корнеля об использовании QueryPerformanceCounter является превосходным.
Если это не работает для вас, и вы не возражаете против другого решения только для Windows, используйте "мультимедийные таймеры" Windows. Найдите в файлах справки Visual Studio значения "timeBeginPeriod", "timeEndPeriod" и "Использование мультимедийных таймеров".
Чтобы использовать мультимедийные таймеры, вам нужно включить заголовок и ссылку с winmm.lib:
#include <mmsystem.h>
#pragma comment( lib, "winmm" ) // need this library for multimedia timers