Странное поведение QueryPerformanceCounter для измерения микросекунд - PullRequest
0 голосов
/ 18 октября 2018

Мне нужно измерить производительность моей письменной функции.Поскольку я не могу использовать C ++ 11 и мне нужны микросекунды, я использовал QueryPerformanceCounter из windows.h.

#include <Windows.h>
LARGE_INTEGER begin, end, frequency;

double timeElapsed = 0.0;

QueryPerformanceFrequency(&frequency);

for (int i = 0; i < 100; i++) {
    QueryPerformanceCounter(&begin);

    myFunctionToTest();

    QueryPerformanceCounter(&end);

    // get microsecs
    timeElapsed = ((end.QuadPart - begin.QuadPart) * 1000.0 / frequency.QuadPart) * 1000;

    std::cout << timeElapsed << std::endl;

    appendToCsvFile(timeElapsed);
}

Результаты timeElapsed обычно составляют от 2 до 10 микросекунд, если я НЕ вызываю appendToCsvFile ().

Вызов функции appendToCsvFile (), который не делает ничего, кроме записи результата в файл, сильно влияет на результат измерения (результаты от 20 до 60 микросекунд).

Функция называется ПОСЛЕ измерения, но она имеет некоторый эффект. Есть ли причина, по которой это возможно?Существует ли какая-либо библиотека для Visual C ++ 2010, которая подходит для микросекундных измерений?

1 Ответ

0 голосов
/ 18 октября 2018

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

Существует множество возможных причин этого, в том числе:

  1. Очистка кэшей ЦП с помощью appendToCsvFile без этого вызова myFunctionToTest использует одну и ту же память снова и снова, что приводит к хорошему теплому кешу и лучшей производительности.
  2. Когда вы пишете файл, вы запускаете целый ряд действий, которые в конечном итоге приводят к даннымв конечном итоге на вашем носителе.Не все эти действия будут завершены, когда управление вернется к вашей программе, что приведет к дополнительному фоновому использованию ЦП, что замедлит myFunctionToTest
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...