ТЕХНИКА ОПТИМИЗАЦИИ ПРОГРАММ

       

Определение степени покрытия


Вообще-то говоря, определение степени покрытия не имеет никакого отношения к оптимизации приложений и это – побочная функция профилировщиков. Но, поскольку она все-таки есть, мораль обязывает автора рассмотреть ее – пускай и кратко.

Итак, покрытие – это процент реально выполненного кода программы в процессе его профилировки. Кому нужна такая информация? Ну, в первую очередь, тестерам, – должны же они убедиться, что весь код приложения протестирован целиком и в нем не осталось никаких "темных" мест.

С другой стороны, оптимизируя программу очень важно знать какие именно ее части были профилированы, а какие нет. В противном случае многих "горячих" точек можно просто не заметить только потому, что соответствующие им ветки программы вообще ни разу не получили управления!

Рассмотрим, например, как может выглядеть протокол покрытия функций, сгенерированный профилировщиком profile.exe для нашего тестового примера pswd.exe (о самом тестовом примере см. "Практический сеанс профилировки с VTune")

Program Statistics                              ; Статистика по программе

------------------

    Command line at 2002 Aug 20 03:36: pswd     ; командная

строка

    Call depth: 2                               ; глубина вызовов: 2

    Total functions: 5                          ; всего

функций: 5

    Function coverage: 60,0%                    ; покрыто

функций: 60%



Module Statistics for pswd.exe                  ; статистика

по модулю pswd

------------------------------

    Functions in module: 5                      ; функций

в модуле: 5

    Module function coverage: 60,0%             ; функций

прокрыто: 60%

Covered Function                                ; порытые функции

----------------

    .    _DeCrypt (pswd.obj)

    .    __real@4@4008fa00000000000000 (pswd.obj)

    *    _gen_pswd (pswd.obj)

    *    _main (pswd.obj)

    *    _print_dot (pswd.obj)

Тут на чистейшем английском языке написано, что лишь 60% функций получили управление, а остальные 40% не были вызваны ни разу! Разумно убедиться: а вызываются ли эти функции когда ни будь вообще или представляют собой "мертвый" код, который можно безболезненно удалить из программы, практически на половину уменьшив ее в размерах?

Если же эти функции при каких-то определенных обстоятельствах все же получают управление, нам необходимо проанализировать исходный код, чтобы разобраться: что же это за обстоятельства и воссоздать их, чтобы профилировщик смог прогнать и остальные участки программы. Имена покрытых и непокрытых функций перечислены в секции Cover Function. Покрытые отмечаются знаком "*", а непокрытые – "."

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



Содержание раздела