Вы должны убедиться, что функция регулирования частоты / зеленый отключена на уровне ОС.Перезагрузите машину.В противном случае может возникнуть ситуация, когда ядра имеют несинхронизированные значения счетчика меток времени.
Чтение 243 является наиболее распространенным, что является одной из причин его использования.С другой стороны, предположим, что у вас есть истекшее время <249: вы вычитаете накладные расходы и получаете недостаточное количество.Так как арифметика без знака, вы получите огромный результат.Этот факт говорит о том, что вместо этого используется самое низкое значение (243).Чрезвычайно сложно точно измерить последовательности длиной всего несколько циклов.На типичном x86 с частотой несколько ГГц я бы рекомендовал использовать временные последовательности короче 10 нс, и даже при такой длине они, как правило, будут далеки от идеального. </p>
Остальная часть моего ответа - то, что я делаю,как я оперирую результатами и моими рассуждениями по предмету.
Что касается накладных расходов, проще всего использовать такой код, как этот
unsigned __int64 rdtsc_inline (void);
unsigned __int64 rdtsc_function (void);
Первая форма выдает инструкцию rdtsc всгенерированный код (как в вашем коде).Второй вызовет вызов функции, выполнение rdtsc и инструкцию возврата.Возможно, он будет генерировать кадры стека.Очевидно, что вторая форма намного медленнее первой.
Затем можно написать код (C) для расчета накладных расходов
unsigned __int64 start_cycle,end_cycle; /* place these @ the module level*/
unsigned __int64 overhead;
/* place this code inside a function */
start_cycle=rdtsc_inline();
end_cycle=rdtsc_inline();
overhead=end_cycle-start_cycle;
Если вы используете встроенный вариант, вы получите низкий(э) накладные расходы.Вы также рискуете рассчитать накладные расходы, которые больше, чем «должно» быть (особенно для функциональной формы), что, в свою очередь, означает, что если вы измеряете очень короткие / быстрые последовательности, вы можете столкнуться с ранее рассчитанными накладными расходами, которыебольше, чем само измерение.Когда вы пытаетесь приспособиться к накладным расходам, вы получите недостаточный уровень, который приведет к грязным условиям.Лучший способ справиться с этим состоит в том, чтобы
- время накладных расходов несколько раз и всегда использовать наименьшее достигнутое значение,
- не измерять действительно короткие последовательности кода, поскольку вы можете столкнуться с эффектами конвейерной обработки, которыепотребуются грязные инструкции синхронизации перед инструкцией rdtsc и
- , если вам нужно измерить очень короткие последовательности, рассматривайте результаты как индикаторы, а не как факты
Я ранее обсуждал, что я делаю срезультаты в этой теме .
Другая вещь, которую я делаю, - это интеграция измерительного кода в приложение.Накладные расходы незначительны.После вычисления результата я отправляю его в специальную структуру, где подсчитываю количество измерений, суммирую значения x и x ^ 2 и определяю минимальные и максимальные измерения.Позже я могу использовать данные для расчета среднего и стандартного отклонения.Сама структура индексируется, и я могу измерять различные аспекты производительности, такие как отдельные функции приложения («функциональная производительность»), время, затрачиваемое на процессор, чтение / запись на диск, чтение / запись по сети («нефункциональная производительность») и т. Д.
Если приложение инструментируется таким образом и контролируется с самого начала, я ожидаю, что риск возникновения проблем с производительностью в течение срока его службы будет значительно снижен.