Думаю, все уже знают, но всё же.
Иногда нужно прикинуть, сколько процессорного времени требуется для выполнения тех или иных функций программы (я сейчас в основном говорю о C++).
Что ж, ниже я представляю свой метод, простой, но вполне удовлетворительный для меня.
Инструментировать код можно разными специальными инструментами (я не пробовал, типа DevPartner один из них, думаю, их сейчас очень много).
Функции, основанные на времени, работают не очень хорошо; Я не нашел их ни в WinAPI, ни в каком-либо другом API. Две особенности, которые мне очень понравились: Частота выполнения запроса ЗапросPerformanceCounter В общем, тут можно не читать статью, погуглите немного и хватит :) Используя эту пару функций, можно получить достаточно точные оценки времени выполнения программных вычислений.
На самом деле, Частота выполнения запроса возвращает количество элементарных операций, которые ваш процессор может выполнить за одну секунду.
ЗапросPerformanceCounter возвращает количество элементарных операций, которые он уже выполнил с момента запуска компьютера.
«GetTickCount» вроде бы является альтернативой, но его точности мне как-то не хватило, либо меня не устроило его поведение, которое не очень четко описано в MSDN; скорее, его можно использовать только для вычислений пользовательского интерфейса.
Вычислить, сколько секунд потребуется на вызов любой функции (метода класса) DoWork() с использованием QueryPerformanceFrequency/QueryPerformanceCounter, на самом деле довольно просто:
LARGE_INTEGER performanceCounter; ::QueryPerformanceFrequency(&performanceCounter); LARGE_INTEGER performanceCounterStart; ::QueryPerformanceCounter(&performanceCounterStart); DoWork(); LARGE_INTEGER performanceCounterEnd; ::QueryPerformanceFrequency(&performanceCounterEnd); double timeElapsed = (double*)(performanceCounterEnd) - (double*)(performanceCounterEnd)Грешный код, конечно, я просто показал идею, может кому-то пригодится.
В общем, QueryPerformanceCounter — это ассемблерная инструкция «ReaD Time Stamp Counter (RDTSC)» (вру o5, название инструкции #0f, #31, хотя стесняюсь сказать, на каких процессорах она работает, ибо за что прошу прощения :) ПС.
При оценке производительности и простейших тестах, которые я иногда использую, стоит обратить внимание на компилятор, у большинства вменяемых компиляторов есть блок кода типа
CalculateSinus (cobst Double &x) { return sin(x); } static const double x = PI / 4; double y = CalculateSinus(x)будет преобразовано таким образом, что его вообще не нужно будет рассчитывать во время выполнения, а y=sin(PI/4) будет рассчитываться на этапе компиляции.
Теги: #Ассемблер #производительность #оптимизация #c plus plus #Чулан
-
Самые Лучшие Стратегии В Социальных Сетях
19 Oct, 24 -
[Api] Формирование Видения Продукта
19 Oct, 24 -
Хранимые Процедуры. Кто Быстрее
19 Oct, 24 -
Амперсанды В Строковых Константах
19 Oct, 24 -
Вопросы По Php (Интервью)
19 Oct, 24