2015-03-27 5 views
1

Я профилирую вызов Direct3D9 API. Я прочитал много документации here, которая описывает процесс. У меня есть вопрос, хотя бы о вычислении прошедших тактовых циклов. Вот мой текущий метод:Как преобразовать тики в тактовые циклы?

// 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 то номера находятся в диапазоне ... Я просто хотел, чтобы проверить мой метод ...

ответ

-1

Цитирование ваш заданный источник, формула вы бы использовать это:

циклов = частота процессора * количество тиков/QPF

на самом деле вы делаете именно это в последней строке кода примера, где «магическое число» 2.8E9 является скорость процессора в Гц. Так что если это ваш вопрос, ответ Да, вы используете правильную формулу.

Если вы хотите заменить свое магическое число на фактическую скорость процессора, будьте готовы к хорошему количеству работы. Для получения дополнительной информации по этому вопросу см ответа Finding out the CPU clock frequency (per core, per processor)


Однако для того, чтобы получить достоверные результаты профилирования, лучший метод будет использовать внешний инструмент профилирования, потому что при изменении кода для измерения времени выполнения, его может фактически повлиять на вещи, которые вы хотите измерить (например, относительно оптимизации).

Проверьте вики для некоторых разумных инструментов профилирования: http://en.wikipedia.org/wiki/List_of_performance_analysis_tools#C_and_C.2B.2B

Помимо вашего интереса cicles процессора, тем лучше «навязчивый» подход будет использовать платформу независимый механизм из стандартной библиотеки C++ 11 для измерения Истекшее время: http://en.cppreference.com/w/cpp/chrono/high_resolution_clock/now

+0

Меня интересует, как рассчитываются тактовые циклы –

+0

Циклы часов не могут быть рассчитаны, они считаются терминами _QueryPerformanceCounter_. Нет простого способа оценить объем работы отдельных аппаратных компонентов для вашей обработки. Современные компьютеры/ОС строятся так, чтобы скрыть это. Также в связанной статье говорится, что он просто использует этот метод, потому что «он доступен в Windows и его легко использовать» для «времени выполнения ** **». Мой ответ просто предлагает лучшие способы достижения этого. Извините, что, возможно, неправильно истолковал свой вопрос, но я не вижу дополнительной информации, чтобы дать здесь. –

+0

Мне интересно понять формулу, используемую для вычисления количества циклов, прошедших при задании двух временных меток ... Формула в вышеприведенном вопросе говорит о умножении тиков по скорости процессора в hz и делении на частоту таймера высокого разрешения. Это верно? –