Я профилирую вызовы Direct3D9 API. Я прочитал много документации Вот который описывает процесс. У меня есть вопрос по поводу расчета прошедших тактов. Вот мой текущий метод:
// measurement vars
LARGE_INTEGER start, stop, freq;
//
// flush command buffer here
//
//
// issue begin query here
//
// start timer
QueryPerformanceCounter(&start);
//
//draw
//
//
// issue end query here and wait on results
//
// stop timer
QueryPerformanceCounter(&stop);
// calc elapsed ticks
stop.QuadPart -= start.QuadPart;
// get frequency
QueryPerformanceFrequency(&freq);
// ticks for easier handling
ULONG ticks = stop.QuadPart;
// calc elapsed clock cycles
cycles = (2.8E9 * ticks) / (double)freq.QuadPart;
Мой вопрос касается значения 2.8E9, которое должно представлять скорость процессора. Это правильный способ расчета тактов? Я профилирую отдельные вызовы API, и мои результаты отличаются от результатов, указанных в приведенной выше ссылке. Если я установлю частоту процессора на 1E9, то цифры будут в пределах диапазона … Я просто хотел проверить свой метод …
Ссылаясь на ваш источник, формула, которую вы бы использовали:
циклы = скорость процессора * количество тактов / QPF
Фактически вы делаете именно это в последней строке вашего примера кода, где «магическое число» 2.8E9 — это скорость вашего процессора в Гц. Так что, если это ваш вопрос, ответ Да, вы используете правильную формулу.
Если вы хотите заменить свое магическое число фактической скоростью процессора, будьте готовы к хорошему объему работы. Для получения дополнительной информации об этом см. Ответ
Выяснение тактовой частоты процессора (на ядро, на процессор)
Однако для получения надежных результатов профилирования лучшим методом будет использование внешнего инструмента профилирования, потому что когда вы изменяете свой код для измерения времени выполнения, он может фактически влиять на то, что вы хотите измерить (например, в отношении оптимизации).
Посмотрите в вики некоторые разумные инструменты профилирования:
http://en.wikipedia.org/wiki/List_of_performance_analysis_tools#C_and_C.2B.2B
Помимо вашего интереса к циклам ЦП, лучшим «навязчивым» подходом будет использование независимого от платформы механизма из стандартной библиотеки C ++ 11 для измерения прошедшего времени:
http://en.cppreference.com/w/cpp/chrono/high_resolution_clock/now