Как найти истекшее время функции 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); 
}
Другие вопросы по тегам