Скачиваний:
23
Добавлен:
01.05.2014
Размер:
103.42 Кб
Скачать

Представление результатов в исходном коде (Source View)

Данное представление отображает исходный код профилируемой программы. Для поддержки этой функциональности необходимо указать профилировщику путь к исходникам программы. Программа должна быть скомпилирована с отладочной информацией (debug information), либо необходимо указать путь к файлу, содержащему таблицу символов (symbol information). Информация о символах нужна профилировщику для отображения имен функций в отчете по модулям (modules report), окне статического анализа кода (static code analysis window) и окне исходного кода (source window). VTune пытается найти отладочную информацию в библиотечном файле. Если отладочная информация не найдена, профилировщик запросит файл, содержащий требуемые данные. VTune может работать со следующими типами символьной информации:

  1. Символьные таблицы COFF – формата в объектных файлах.

  2. Интегрированная отладочная информация Microsoft( NB09, NB11), Borland(FB09, FB0A), IBM Visual Age C++ (NB04), Watcom (DWARF 2), Novell (NB05)

  3. pdb- файлы (program database files), генерируемые Microsoft Visual C++.

  4. dbg-файлы (debug files), распространяемые вместе с SDK и DDK Microsoft или созданные утилитой rebase.exe.

  5. sym-файлы, распространяемые с SDK и DDK Microsoft и Novell.

  6. map-файлы сборщика (linker’a)

  7. hdr-файлы, создаваемые утилитой exehdr.exe от Microsoft.

  8. dmp-файлы, создаваемые утилитой dumpbin.exe доступной после установки Microsoft Visual C++.

  9. W3 и W4 файлы, распространяемые с VxD.

В представлении исходного кода отображается исходный код функции, блока или «узкого места» (hotspot). Также отображаются номер строчки и смещение для каждой операции. Данное представление позволяет:

  • Посмотреть процент времени, который был затрачен на выполнение каждой строчки кода или количество выборок, собранных во время профилирования TBS или EBS.

  • Для режима EBS посмотреть индикаторы производительности (performance indicators).

  • Количество вызовов функции и время, затраченное на выполнение функции для режима графа вызовов (Call Graph Profiling).

  • Произвести статический анализ кода и посмотреть дизассемблированный код.

  • Произвести динамический анализ кода и вывести результаты для инструкций языка высокого уровня, инструкций ассемблера или работать с совмещенным представлениеем исходного кода и ассемблерных инструкций.

  • Вызвать модуль “Code Coach” и получить «совет» по оптимизации кода для языков C, C++, Fortran или Java.

  • Вызвать модуль “Assembly Coach” для оптимизации ассемблерных инструкций.

При интерпретации данных необходимо учитывать, что цифры, отображаемые рядом с инструкцией, могут относиться ко всему циклу или данному блоку, а не к инструкции, рядом с которой они отображаются. Такой эффект обусловлен оптимизациями выполнения инструкций в современных процессорах. В общем случае, если инструкция была совмещена (paired) на процессоре Pentium или Pentium MMX, значение выборки следует относить к инструкции непосредственно перед ней. Если же инструкция совмещена не была, то значение может относиться к инструкции, расположенной через одну инструкцию от данной. Чтобы получить более точные данные по времени выполнения, нужно выполнить динамический анализ ассемблерных инструкций (dynamic assembly analysis). Из-за явления «запаздывания событий» («event skid») аритектура Intel-процессоров позволяет инструкции завершиться перед тем, как управление будет передано VTune для того, чтобы сделать выборку адреса инструкции. К тому времени, как инструкция закончила свое выполнение, счетчик инструкций CS:IP получает новое значение и «указывает» на инструкцию, которая только будет выполняться. В результате профилировщик относит сделанную выборку к инструкции, которая только еще будет выполнена, а не к той инструкции, выполнение которой только что завершилось. Таким образом, время, отображаемое рядом с инструкцией в ассемблерном листинге, относится как минимум к предыдущей инструкции. В следующих ситуациях время следует относить к еще более «ранним» инструкциям:

  • Инструкция, которая выполнялась, была «совмещена» (paired) со следующей инструкцией. Такое случается только на порцессорах Pentium и Pentium MMX.

  • Выполнявшаяся инструкция является jump или call инструкцией, вызывающей ветвление алгоритма.

Из-за описанного явления на процессорах семейства P6 в режиме EBS отображаемые данные следует относить к инструкциям, расположенным на 5-10 инструкций от той, радом с которой эти данные отображаются. Рассмотрим пример. На Pentium процессоре можно получить следующие результаты:

29.96% for( i = 0; i < count; i++ )

4.70% numlist[N(i)]++;

В данном случае 29.96%времени выполняется группа инструкций, в которую транслируется кодnumlist[N(i)]++. Если просмотреть совмещенный листинг исходного и ассемблерного кода, то можно заметить, что после группы инструкций «numlist» следует инструкцияjump, передающая управление на начало цикла. На процессореIntel486 другая картина:

4.70% for( i = 0; i < count; i++ )

29.96% numlist[N(i)]++;

Это обусловлено тем фактом, что инструкции в конце цикла не были совмещены (paired) и значениеCS:IP было близко к адресу инструкции, которая выполнялась29.96% времени, достаточно близко, чтобы профилировщик соотнес полученные данные с операторомnumlist[N(i)]++, а не сfor.

Рассматривая пример test_cyc, необходимо отметить, что данные VTune достаточно достоверны для одинаковых по смыслу участков кода, но записанных разнами способами, что отличает данный профилировщик в выгодную сторону от TurboProfiler фирмы Borland:

10