Как найти истекшее время функции C в Windows или Linux
Я выполняю некоторые функции my_task
, Я хочу вычислить, сколько времени (или тактовых циклов) потребовалось процессору для выполнения этой функции, потому что я собираюсь улучшить производительность этой функции. Поэтому я ссылался на Windows API и написал следующий код.
typedef struct timer
{
LARGE_INTEGER t1;
LARGE_INTEGER t2;
LARGE_INTEGER frequency;
}MY_TIMER_S;
int start_timer(MY_TIMER_S *a)
{
QueryPerformanceFrequency(&a->frequency);
QueryPerformanceCounter(&a->t1);
}
int stop_timer(MY_TIMER_S *a)
{
double elsapsedtime;
QueryPerformanceCounter(&a->t2);
elapsedtime = (a->t2.QuadPart - a->t1.QuadPart) * 1000.0 / a->frequency.QuadPart;
printf("Elapsed time is %lf ms\n", elapsedtime);
}
void main()
{
MY_TIMER_S a = {0};
int i = 0;
for (i = 0; i < 3; i++)
{
start_timer(&a);
my_task();
stop_timer(&a);
}
}
Выход
Elapsed time is 0.113352 ms
Elapsed time is 0.203253 ms
Elapsed time is 0.104254 ms
Эти три значения с точностью до наносекунд, но не с точностью. Я думал так, потому что переключение процессов происходило в других приложениях, которые параллельно работают в моей системе. Я проверил свой диспетчер задач, который показывал 124 запущенных процесса. Итак, я перезапустил мою систему (сейчас 84 процесса в диспетчере задач), а затем вывод
Elapsed time is 0.083162 ms
Elapsed time is 0.113223 ms
Elapsed time is 0.074258 ms
После чего я выполнил свой exe с start /high
команда, то также я не получаю значения точности.
Мой вопрос заключается в том, как более точно рассчитать прошедшее время функции в Windows или Linux.
Среда: 32-битная Windows 7 на процессоре i5, 4 Гб оперативной памяти с компилятором Visual Studio 2005 C
1 ответ
Вместо того чтобы делать
for (i = 0; i < 3; i++)
{
start_timer(&a);
my_task();
stop_timer(&a);
}
делать
for (i = 0; i < 3; i++)
{
start_timer(&a);
for (j = 0; j < 30000; j++)
{
my_task();
}
stop_timer(&a);
}