Расчет времени по коду 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
Другие вопросы по тегам