Профіліровщік Quantify p>
Введення p>
Quantify,
вставляючи налагоджувальний код в бінарний текст тестового модуля, заміряє
тимчасові інтервали, які пройшли між попереднім і поточними запусками.
Отримана інформація відображається у кількох видах: табличному, графічному,
комбінованому. p>
Статистична
інформація від Quantify дозволить дізнатися які dll бібліотеки брали участь у
роботу додатку, дізнатися список всіх викликаних функцій з їх іменами,
формальними параметрами виклику й з статистичними аналізатором, що показує
p>
Гнучка
система фільтрів Quantify дозволяє, не захаращуючи екран зайвими висновками
(наприклад, системними викликами) дозволяє отримувати необхідну інформацію або
тільки про внутрішні, програмних виклики або тільки про зовнішні, або комбінуючи
обидва підходи. p>
Озброївшись
отриманої статистикою, розробник без праці виявить вузькі місця в
продуктивності тестової програми та усуне їх в найкоротші терміни. p>
Запуск додатків p>
p>
Малюнок
1 показує дії після вибору «File-> Run», в результаті якого можна
вибрати ім'я зовнішнього модуля і аргументи його дзвінка. p>
В
Як параметри налаштування можна вибрати метод вставки налагоджувальному коду: p>
Line. Найкращий спосіб вставки
налагоджувальному коду. Заміряється час виконання кожного рядка тестуємого
додатки. p>
Function. Те ж саме, що і для «line»,
але з виміром для виконавчі викликаються функцій. p>
Time. Здійснює збір тимчасової
інформації і на основі цього ви машинні цикли. p>
За
замовчуванням Quantify збирає статистичну інформацію в модулі тестуємого
продукту і у всіх зовнішніх бібліотеках. p>
p>
Початок
насичення тестової програми супроводжується появою вікна
інструментірованія, в якому порядково відображаються всі модулі, що викликаються
основним. Дані модулі, як говорилося вище, насичуються налагоджувальний кодом і
поміщаються в спеціальну директорію «cache» за адресою
«Rationalquantifycache». Відзначимо, що початковий запуск
інструментірванія процес тривалий, але кожний наступний виклик скорочує
загальний час очікування в силу того, що вся необхідна інформація вже є в
Кеші. p>
З
точки зору дискової ємності, файл (Кешована) налагоджування від
Quantify вдвічі довший за свого побратима без налагоджувальної інформації. P>
Аналіз інформації p>
«Run Summary» p>
Плавно
переходимо до наступної стадії тестування, власне, до збору інформації. За
закінчення процесу насичення налагоджувальний кодом модулів тестової програми,
Quantify переходить до його виконання, вироблених, звичайним чином, за одним
винятком: запис станів тестової програми продовжує проводитися в
фоновому режимі. p>
p>
Малюнок
3 демонструє фрагмент вікна «Summary», в якому проводиться запис
стану тестової програми. Причому, що дуже примітно,
тестування проводиться не тільки для простого додатка, але і для багато
поточного. В останньому випадку (див. малюнок 3), тестується кожен потік
окремо. У будь-якому випадку, навіть якщо додаток Однопотокові, то ім'я основного
(єдиного) потоку іменується як «. main_0», що видається цілком
логічним. p>
Інформаційний
графік поступово наповнюється квадратами різного кольору, що демонструють
поточний стан тестової програми. p>
Відзначимо
із деякі них: p>
Running. Початок виконання потоку; p>
Waiting IO. Очікування дій з
вводувиводу; p>
Blocked. Блокування виконання
потоку; p>
Quantify. Очікування виклику модуля
Quantify; p>
Exited. Закінчення виконання потоку.
p>
Важливий
аспект при тестуванні - отримання статистичної інформації про кількість
зовнішніх бібліотек, що викликало основну програму, а також елементарне
опис машини, на якій проводилося тестування. Останнє особливо важливо,
так як буває, що помилка проявляється тільки на процесорах строго
певної серії або виробника. Всі статистичні аспекти вирішуються
всередині вікна «Summary». p>
Наступні
два приклади показують статистичну інформацію: p>
(1) Загальний звіт - «Details»: p>
Program Name:
C: projectsaaDebugaa.exe p>
Program Arguments: p>
Working Directory:
C: projectsaaDebug p>
User Name: Alex p>
Product Version: 2002.05.00 4113 p>
Host Name: ALEX-GOLDER p>
Machine Type: Intel Pentium Pro
Model 8 Stepping 10 p>
# Processors: 1 p>
Clock Rate: 847 MHz p>
O/S Version: Windows NT 5.1.2600 p>
Physical Memory: 382 MBytes p>
PID: 0xfbc p>
Start Time: 24.04.2002 14:17:38 p>
Stop Time: 24.04.2002 14:17:52 p>
Elapsed Time: 13330 ms p>
# Measured Cycles: 191748 (0 ms) p>
# Timed Cycles: 2489329 (2 ms) p>
Dataset Size (bytes): 0x4a0001. p>
(2) «Log» p>
Quantify for Windows, p>
Copyright (C) 1993-2001 Rational
Software Corporation All rights reserved. P>
Version 2002.05.00; Build: 4113; p>
WinNT 5.1 2600 Uniprocessor Free p>
Instrumenting: p>
Far.exe 620032 bytes p>
ADVAPI32.DLL 549888 bytes p>
ADVAPI32.DLL 549888 bytes p>
USER32.DLL 561152 bytes p>
USER32.DLL 561152 bytes p>
SHELL32.DLL 8322560 bytes p>
SHELL32.DLL 8322560 bytes p>
WINSPOOL.DRV 131584 bytes p>
WINSPOOL.DRV 131584 bytes p>
MPR.DLL 55808 bytes p>
MPR.DLL 55808 bytes p>
RPCRT4.DLL 463872 bytes p>
RPCRT4.DLL 463872 bytes p>
GDI32.DLL 250880 bytes p>
GDI32.DLL 250880 bytes p>
MSVCRT.DLL 322560 bytes p>
MSVCRT.DLL 322560 bytes p>
SHLWAPI.DLL 397824 bytes p>
SHLWAPI.DLL
397824 bytes p>
Для
розробника або тестера інформація (інформаційний звіт), представлена
вище, здатна пролити світло на ті статистичні дані, які супроводжували,
а точніше, формували середу тестування. p>
Дерево викликів «Call
Graph » p>
Наступний
найцікавіший спосіб аналізу конструкції додатки - це перегляд дерева
викликів. Вікно, показане на 4 малюнку, показує лише фрагмент вікна з
діаграмою дзвінків. p>
p>
Зверніть
увагу на кількість і послідовність виклику різних модулів потоку
«Main». Жирна лінія показує найбільш тривалі гілки (що містять або
часто викликаються функції, або функції, що виконувалися довше інших). Для
демонстрації можливостей Quantify було сконструйовано простий додаток,
що складається з функції "main» і двох додаткових «recursive» і «outside» (див.
лістинг 1). p>
Лістинг 1. Приклад тестового
додатки, сконструйованому у вигляді консольного застосування з Visual Studio
6.0. Мова реалізації «С». P>
# include
"stdafx.h" p>
// Створюємо
функцію-заглушку p>
void
outside (void) p>
( p>
static
int v = 0; p>
v ++; p>
) p>
// Створюємо
рекурсивну функцію, реклама, яка 100 раз p>
int recursive (void) p>
( p>
static int i = 0; p>
int
oo; p>
outside ();// Викликаємо
функцію заглушку p>
if (i == 100) (i = 1; return
0;)// Обнуляємо лічильник і виходимо p>
i ++; p>
recursive (); p>
) p>
int main (int argc, char * argv []) p>
( p>
int i; p>
for (i = 0; i