Вычисление времени по коду С++

Я знаю, что этот вопрос был задан несколько раз, но ни один из них не помогает мне, поэтому снова спрашивайте.

Я использую 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 ;