Я использую 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.
Я обычно использую 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;
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 использовать некоторое время процессора тоже.
Следующий текст, с которым я полностью согласен, цитируется Оптимизация программного обеспечения на C ++ (хорошее чтение для любого программиста C ++) —
Измерения времени могут потребовать очень высокого разрешения, если время
интервалы короткие. В Windows вы можете использовать
GetTickCount
или же
QueryPerformanceCounter
функции для разрешения в миллисекундах. Много
более высокое разрешение можно получить с помощью счетчика меток времени в
CPU, который считает тактовую частоту процессора.
Существует проблема в том, что «тактовая частота может динамически изменяться и
измерения нестабильны из-за прерываний и переключателей задач «.
В 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);