Вычисление времени по коду С++
Я знаю, что этот вопрос был задан несколько раз, но ни один из них не помогает мне, поэтому снова спрашивайте.
Я использую windows xp и запускаю visual studio С++ 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
Ответы
Ответ 1
Вот что я использую для печати времени в миллисекундах.
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 ));
Ответ 2
Вам нужен таймер с высокой точностью. В случае использования Visual Studio используйте QueryPerformanceCounter.
Если точность все еще недостаточна, используйте информацию о компиляторе:
#include <intrin.h>
#pragma intrinsic(__rdtsc)
unsigned __int64 ticks = __rdtsc();
См. информацию об этом intristic здесь.
Оба решения - только Windows, последний, вероятно, только MSVC. Я могу опубликовать аналогичное решение для GCC/Linux, если это необходимо.
Ответ 3
Если вы находитесь в Windows, функция GetTickCount()
- это удобный способ получить таймер с большим разрешением, чем 1 секунда. Разрешение GetTickCount
зависит от вашей операционной системы, но, вероятно, где-то между 10 мс и 16 мс.
Обратите внимание, что для быстрых операций выполнение кода один раз будет недостаточным. Ваш код может работать как 0,02 мс, что означает, что вы получите 0 из счетчика, например GetTickCount
. Ваш код может не выполняться достаточно долго, чтобы таймер "пометил" до следующего значения. Решение состоит в том, чтобы запустить ваш код в цикле миллион раз или что-то еще, разделить всю сумму, а затем разделить на миллион.
Ответ 4
Обычно люди делают что-то подобное для измерения небольшого интервала времени:
t0 = getTime();
for(int i = 0; i<1000000; ++i) {
your code
}
t1 = getTime();
timePassed = (t1-t0)/1000000;
Ответ 5
Предложение Kornel по использованию QueryPerformanceCounter - отличный вариант.
Если это не работает для вас, и вы не против другого решения для Windows, используйте "мультимедийные таймеры" Windows. Найдите файлы справки Visual Studio для "timeBeginPeriod", "timeEndPeriod" и "Использование мультимедийных таймеров".
Чтобы использовать мультимедийные таймеры, вам нужно включить заголовок и ссылку с помощью winmm.lib:
#include <mmsystem.h>
#pragma comment( lib, "winmm" ) // need this library for multimedia timers
Ответ 6
Вот портативная, самодостаточная, короткая реализация именно того, что вам нужно: http://cplusplus.co.il/2009/08/19/portable-measurement-of-execution-time/
Если разрешение не достаточно хорошо, вы должны выполнить свой тест пару раз.
Ответ 7
Это работает
#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 ;