точное измерение времени

Я использую time.h в C ++, чтобы измерить время функции.

clock_t t = clock();
someFunction();
printf("\nTime taken: %.4fs\n", (float)(clock() - t)/CLOCKS_PER_SEC);

Тем не менее, я всегда получаю время за 0,0000. clock () и t при печати отдельно имеют одинаковое значение. Я хотел бы знать, есть ли способ точного измерения времени (возможно, порядка наносекунд) в C ++. Я использую VS2010.

44

Решение

Я обычно использую QueryPerformanceCounter функция.

пример:

LARGE_INTEGER frequency;        // ticks per second
LARGE_INTEGER t1, t2;           // ticks
double elapsedTime;

// get ticks per second
QueryPerformanceFrequency(&frequency);

// start timer
QueryPerformanceCounter(&t1);

// do something
...

// stop timer
QueryPerformanceCounter(&t2);

// compute and print the elapsed time in millisec
elapsedTime = (t2.QuadPart - t1.QuadPart) * 1000.0 / frequency.QuadPart;
55

Другие решения

C ++ 11 представил Chrono API, Вы можете использовать, чтобы получить наносекунды:

auto begin = std::chrono::high_resolution_clock::now();

// code to benchmark

auto end = std::chrono::high_resolution_clock::now();
std::cout << std::chrono::duration_cast<std::chrono::nanoseconds>(end-begin).count() << "ns" << std::endl;

Для более релевантного значения хорошо запустить функцию несколько раз и вычислить среднее значение:

auto begin = std::chrono::high_resolution_clock::now();
uint32_t iterations = 10000;
for(uint32_t i = 0; i < iterations; ++i)
{
// code to benchmark
}
auto end = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(end-begin).count();
std::cout << duration << "ns total, average : " << duration / iterations << "ns." << std::endl;

Но помни for цикл и назначение begin а также end VAR использовать некоторое время процессора тоже.

88

Следующий текст, с которым я полностью согласен, цитируется Оптимизация программного обеспечения на C ++ (хорошее чтение для любого программиста C ++) —

Измерения времени могут потребовать очень высокого разрешения, если время
интервалы короткие. В Windows вы можете использовать
GetTickCount или же
QueryPerformanceCounter функции для разрешения в миллисекундах. Много
более высокое разрешение можно получить с помощью счетчика меток времени в
CPU, который считает тактовую частоту процессора.

Существует проблема в том, что «тактовая частота может динамически изменяться и
измерения нестабильны из-за прерываний и переключателей задач «.

6

В C или C ++ я обычно делаю как ниже. Если это все еще не помогает, вы можете рассмотреть возможность использования функций rtdsc

      struct timeval time;
gettimeofday(&time, NULL); // Start Time

long totalTime = (time.tv_sec * 1000) + (time.tv_usec / 1000);

//........ call your functions here

gettimeofday(&time, NULL);  //END-TIME

totalTime = (((time.tv_sec * 1000) + (time.tv_usec / 1000)) - totalTime);
2