7. РАСЧЕТНОЕ ЗАДАНИЕ 2. TRUE TIME

Перед началом работы необходимо установить на ваш компьютер пакет программ Visual Studio 6.0 (установить компоненты, выбранные по умолчанию) и программу True Time 1.22. Программа True Time корректно работает в операционных системах Windows 98, Millennium, 2000, XP. Но для работы программы True Time в Windows 2000 и Windows XP необходимо иметь привилегии администратора рабочей станции.

Если запуск True Time приводит к зависанию системы или к появлению «синего экрана смерти», то скорей всего программа True Time не совместима с моделью вашего процессора. Такой эффект был замечен на процессоре AMD Athlon XP 1700+. Решить эту проблему можно с использованием виртуальной машины. В программе VMware Workstation нужно установить операционную систему семейства Windows (например, Windows 2000) и программу NuMega True Time и в дальнейшем использовать True Time только под виртуальной машиной. В данном случае все должно работать корректно. Готовые виртуальные машины можно найти в сети ФКТ КнАГТУ.

True Time – программа для Windows, при помощи которой можно анализировать производительность программ, написанных в Microsoft Visual C++ 6.0.

Замечание. Можно также собрать данные по готовому программному модулю, но в данном случае True Time соберет статистику только по вызовам системных функций, статистику по исходному коду программы вы не получите.

True Time собирает статистические данные по всем вызываемым в программе функциям (в том числе и системным). Происходит это следующим образом: когда вы компилируете программу с использованием True Time, в нее интегрируются  определенные команды, которые отмечают время при каждом входе и выходе из функции. Далее подсчитывается время выполнения и количество вызовов каждой функции.

Так как True Time написана для Windows, а Windows, в свою очередь, многозадачная операционная система, в которой одновременно могут выполняться сразу много программ (процессов), то точность измерений будет зависеть от количества одновременно выполняющихся программ и от степени загрузки процессора. Для получения более точных результатов можно использовать квантовую технологию. При использовании данной технологии учитывается разница между временем, потраченным на выполнение вашей программы и временем, потраченным в других программах, выполняющихся параллельно. Это помогает True Time генерировать точные результаты, которые являются независимыми от того, какие еще программы выполняются в системе.

Для использования квантовой технологии необходимо в меню  Program | Settings на вкладке True Time включить опцию Use Quantum Technology.

Рекомендация. Имеет смысл использовать True Time как можно раньше – еще в ходе разработки программы. Вы можете оценивать производительность (время выполнения, количество вызовов отдельных функций) еще при разработке вашего приложения. Если начнёте думать об оптимизации своей программы на последней стадии ее создания, то может оказаться слишком поздно, чтобы вносить изменения или вам придется переписывать большое количество функций.

Рассмотрим возможности True Time на примере решения конкретной задачи: вычисления корня из числа методом вычислительной математики. Используем для решения данной задачи метод Ньютона.

Теоретические сведения по методу Ньютона

Пусть известен отрезок [a, b], который содержит один корень уравнения f(x) = 0. Функция  f(x) является  дважды  непрерывно дифференцируемой на отрезке  [a, b] и принимает на концах отрезка значения разных знаков . Первая и вторая производные функции f не обращаются в ноль на отрезке [a, b]. При выполнении этих условий для уточнения корня можно использовать метод Ньютона.

Формула метода: .

Точка  x0  –  начальное  приближение  –  выбирается  из  условия: . В качестве x0 выбирается, как правило, один из концов отрезка [a, b]:

если , то x0 = a;

если , то x0 = b.

Для метода Ньютона известны несколько условий остановки итерационного процесса. Одно из них: , где  . При выполнении этого условия xn+1 является приближенным значением корня уравнения  на отрезке [a, b], найденным методом Ньютона с точностью e.

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

· Откройте двойным щелчком мыши по файлу TT.dsp проект приложения.

При этом загрузится Visual C++ и появится панель True Time.

· Выберите в левой панели на странице File View  Sourse Files ® TTDlg.cpp (рис. 7.1). 

Рис. 7.1. Выбор файла TTDlg.cpp

TTDlg.cpp – это файл окна диалога, в котором написан код нажатия кнопки  (т.е. команды, которые необходимо выполнить программе после того, как пользователь нажал на определенную кнопку).

· Просмотрите функцию обработки нажатия кнопки «Run Method» void CTTDlg: :OnBt1(), которая реализует метод Ньютона.

В рассматриваемой программе находится корень из числа 13. Т.к. нам необходимо найти , то нахождение корня из числа сводится к решению уравнения .

· Запустите приложение, выбрав меню Build -> Execute (Ctrl+F5).

При этом ваша программа будет откомпилирована, создан исполняемый файл ТТ.ехе и запущен. Если вы измените текст программы, то Visual C++ покажет вам список измененных файлов проекта и «спросит» принять ли эти изменения перед запуском программы (рекомендуется отвечать – «да»).

Замечание. Если вы увидите сообщение «Thread ID out of range for Mach5, Please consult readme for advice», то это значит, что номер потока вашего приложения больше значения принятого по умолчанию. Можно просто каждый раз нажимать OK, а можно это исправить и сообщение больше появляться не будет. Для этого в системном реестре Windows в ветви HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Services mach5 Parameters нужно создать ключ ThreadDatabaseSize типа dword и присвоить ему значение 65535.

На экране появится окно диалога (рис. 7.2).

· Посмотрите результаты вычислений (нажав на кнопку Run method).

· Закройте приложение, нажав на кнопку EXIT.

· Просмотрите код функции void CTTDlg::OnBt1() снова.

Рис. 7.2. Диалоговое окно

В трех последних строках, реализующих вывод сообщения с результатом, имеется надпись rem. Это значит, что данные строки необходимо сделать комментариями. Данный шаг необходим для профилирования. Если мы не закомментируем эти строки, то они займут большую часть времени выполнения функции OnBt1(), тем самым вводя нас в заблуждение. Для того чтобы сделать строку программы комментарием необходимо перед строкой поставить «//» (пример: // char mess[10];).

· После этого изменения откомпилируйте приложение (Ctrl+F7).

· Затем на панели True Time нажмите кнопку Rebuild All with True Time (перекомпилировать все, используя True Time).

Таким образом, все приложение будет перекомпилировано, а True Time вставит в программу свои функции вызова.

· Нажмите на панели True Time кнопку Run with True Time (запустить, используя True Time).

Запустится True Time и ваше приложение.

· Нажмите на кнопку Run Method и затем EXIT.

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

На экране появится окно программы True Time, в котором отображены собранные статистические данные. В левой части окна находится список:

- Source – отображение списка файлов с исходными кодами программы;

- System отображение списка системных библиотек, которые используются программой;

- Top 20 Source Functions – вывод 20 исходных функций, занявших наибольшее время выполнения;

- Top 20 Functions – вывод 20 функций, занявших наибольшее время выполнения;

- Top 20 Called Source Functions – вывод 20 исходных функций, вызванных наибольшее количество раз;

- Top 20 Called Functions – вывод 20 функций, вызванных наибольшее количество раз.

· Перейдите на страницу Top 20 Source Functions.

В правой части окна есть колонки следующего назначения:

- Function name – имя функции;

- % in Function – процентное отношение времени выполнения функции к общему времени сеанса;

- % with Children – процентное отношение времени выполнения функции и всех функций, вызванных из неё, ко всему времени сеанса;

- Called – количество вызовов функции;

- Average – среднее время, которое занимает выполнение функции;

- Image – имя файла, в котором содержится функция;

- % in Image – время в процентах, которое занимает выполнение данной функции от всех функций данного файла;

- First – время первого выполнения функции;

- Min – минимальное время выполнения функции;

- Max – максимальное время выполнения функции;

- Average with Children – среднее время, которое занимает выполнение функции с учетом всех дочерних функций;

- Real – среднее время выполнения функции вместе с дочерними функциями без использования квантовой технологии;

- Address – адрес функции.

Отображением данных колонок на экране можно управлять при помощи кнопки Columns на панели инструментов.

· Щелкните на заголовке столбца Average для того, чтобы отсортировать список (рис. 7.3).

Рис. 7.3. Статистические данные по функциям

· Щелкните двойным щелчком по функции OnBt1().

На экране появится окно Function Details, где вы можете увидеть более детальную информацию по функции (рис. 7.4).

Рис 7.4. Детальная информация по функции OnBt1()

В верхней части окна содержатся следующие данные сессии относительно функции:

o Image – имя выполняемой программы;

o Called – количество вызовов функции;

o % in Function – процент времени, потраченного на функцию от времени, потраченного на сессию;

o % with Children – процент времени, потраченного на функцию и ее дочерние функции от времени, потраченного на сессию;

o % in Image – процент времени, потраченного на выполнение данной функции от всех функций данного файла;

o Source File – имя исходного файла;

o Average – среднее время выполнения функции;

o First – первое время выполнения функции;

o Maximum – самое медленное возможное время выполнения функции;

o Minimum – самое быстрое возможное время выполнения функции.

Секция Parents содержит данные о родительской функции, из которой вызывается данная функция:

o Parent Functions – имя родительской функции;

o Called – количество вызовов данной функции из родительской;

o Percent – процент времени, потраченного на выполнение данной функции от времени выполнения родительской функции.

Например, функция OnBt1() занимает 0,3383% времени функции IsDialogMessageA() и вызывается из нее 1 раз (рис 7.4).

Секция Children содержит данные о дочерних функциях, которые вызываются из данной функции:

o Child Functions – имя вызванной дочерней функции;

o Called – количество вызовов дочерней функции;

o Percent – процент времени, потраченного на выполнение дочерней функции от времени выполнения данной функции.

Например, функция fabs() занимает 23,46% времени функции OnBt1() и вызывается из нее 5 раз (рис 7.4).

· Обратите внимание, что дочерняя функция pow() (рис. 7.4) вызывается шесть раз и занимает почти половину времени от времени работы функции OnBt1() (у вас могут быть несколько другие данные).

· Закройте  окно  Function  Details и  раскройте вкладку  Session  Summary  (рис. 7.5).

Указанная вкладка содержит следующую информацию:

o Creation Date – время и дата создания файла сессии;

o Started – время начала сессии;

o Ended – время конца сессии;

o Executable – имя и путь выполняемой программы;

o Command Args – параметры выполняемой программы;

o Exit Code – выходной код, создаваемый, когда вы выходите из приложения (0 – корректное завершение программы, другие цифры означают код ошибки в работе программы);

o Processor – тип процессора на машине;

o # of Processors – число процессоров на машине;

o OS Version – версия операционной системы на машине;

o # of Called Functions – число функций, вызываемых в течение сессии;

o # of Calls – число вызовов функций, сделанных в течение сессии;

o Total Timing – общее количество времени, которое центральный процессор потратил на работу над вашим приложением.

Рис. 7.5. Суммарная информация о программе

Далее идет список всех используемых модулей. Для каждого модуля указывается:

o имя;

o Number of called Functions – количество вызываемых из него функций;

o Percent of Time Spent in Image – процент времени, потраченного в данном модуле.

Давайте более подробно рассмотрим выполнение функции OnBt1().

· Раскройте вкладку Function List, вызовите контекстное меню функции OnBt1() и выберите Go To Source.

На экране появится таблица с исходным текстом программы и данными сессии. В данном окне для каждой строки отображается следующая информация:

o Count – количество вызовов строки, т.е. сколько раз управление попадало на эту строку;

o % of Function – время, потраченное на выполнение строки и всех дочерних функций, вызванных из этой строки, как процент от времени, потраченного на выполнение функции;

o % with Children – время, потраченное на выполнение строки и всех дочерних функций, вызванных из этой строки  как процент от времени сессии;

o Time – среднее время выполнения строки;

o Functions – число функций в строке;

o Line # номер строки в исходном тексте программы.

Возможно, у вас отобразится не вся информация. Управление выводом данной информацией также закреплено за кнопкой Columns.

· Отобразите на экране столбцы Count и Time, а остальные скройте (рис. 7.6).

Рис. 7.6. Статистические данные по строкам функции

· Обратите внимание, что строки, занявшие наибольшее время выполнения, выделяются другим цветом.

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

Оптимизация программы

Заменим функцию возведения в степень pow() простым умножением.

· Закройте True Time. На запрос сохранения данных сессии ответьте «да».

Сохранять эти данные нужно для сравнения с последующими данными.

· В Visual C++ в коде функции CTTDlg::OnBt1() замените функцию pow(«число», 2) на «число» * «число». Нажмите кнопку Build with True Time, затем кнопку Run with True Time. Нажмите кнопку Run Method и затем Exit.

Эти операции мы уже выполняли до изменения.

· Теперь снова вызовите окно Function Details для функции OnBt1() (рис. 7.7).

Теперь больше половины времени занимает функция fabs. Если посмотреть вкладку Sourсe (рис. 7.8), то можно увидеть, что время выполнения строки  xx = x — (x*x-13)/(2 * x); уменьшилось более чем в 10 раз. Время работы функции OnBt1() и общее время работы приложения также уменьшилось (рис. 7.9).

Рис. 7.7. Детальная информация по функции OnBt1()

Если вы еще раз посмотрите вкладку Sourse для функции OnBt1() (рис. 7.8), то увидите, что неэффективной строкой осталась строка, содержащая условия выполнения метода, которую уже невозможно оптимизировать.

Рис. 7.8. Статистические данные по строкам функции OnBt1()

Рис. 7.9. Статистические данные после изменений

Дальнейшая оптимизация

Т.к. все строки занимают достаточно малое время выполнения и содержат только простые операции, то исправлять в коде программы больше нечего. Существует другой метод решения нелинейного уравнения – комбинированный метод хорд и касательных.

Теоретические сведения по комбинированному методу хорд и касательных

Условия применения метода те же, что и для метода Ньютона.

Возможны два случая:

· если , то слева применяем метод Ньютона, а справа метод хорд.

Формулы метода:

· если , то слева применяем метод хорд, а справа метод Ньютона.

Формулы метода:

В качестве точек начального приближения выбираются: x0  = a,  .

Условие остановки итерационного процесса: , при выполнении этого условия любую точку из отрезка   можно принять за корень уравнения с точностью e. Чаще всего принимают: .

Вы можете сказать, что этот метод более громоздкий по сравнению с методом Ньютона. Давайте все-таки посмотрим.

· Закройте True Time.

На панели File View имеется файл «методы.txt».

· Выберите двойным щелчком указанный файл.

В данном файле приводятся коды метода Ньютона и комбинированного метода хорд и касательных.

· Вставьте код комбинированного метода хорд и касательных в функцию OnBt1() вместо старого кода.

· Выполните компилирование программы (необходимо выбрать в меню Visual Studio Build | Rebuild all), запустите программу на выполнение (Ctrl+F5) и посмотрите результаты.

· Теперь снова сделайте ремаркой последние три строки, откомпилируйте с True Time и запустите с True Time. Нажмите кнопку Run Method и затем Exit.

Полученная статистика показана на  рис. 7.10.

Время работы функции OnBt1() и общее время работы приложения еще немного уменьшилось.

· Посмотрите подробно выполнение функции OnBt1() (перейдите на вкладку Source [TTDlg.cpp]).

Основные формулы метода вызывались два раза. Таким образом, комбинированный метод хорд и касательных более эффективен, чем метод Ньютона.

В результате выполненных двух изменений время выполнения функции OnBt1() было уменьшено с 6.40 микросекунд до 3.29, общее время работы приложения уменьшено с 3 секунд до 1.4.

Используя True Time мы увеличили эффективность программы, а эффективность – один из важных показателей качества программы.

Рис. 7.10. Статистика по программе

Меню программы True Time

Меню Файл:

o Open – открыть файл проекта, файл сессии или исполняемый файл;

o Close – закрыть файл активной сессии;

o Close Project – закрыть файл активного проекта;

o Save – сохранить все данные активной сессии в файл (для возможности повторного просмотра);

o Save As – сохранить файл активной сессии под новым именем;

o Save All – сохранить все файлы;

o Export Function List – сохранить текущее содержание вкладки Function в файл с расширением .CSV (файл открывается при помощи Microsoft Excel);

o Print – распечатать текущую вкладку активной сессии;

o Print Preview – предварительный просмотр файла активной сессии перед печатью;

o Print Setup – выбор установок и опций печати.

Меню Edit:

o Copy – копировать выбранный текст в буфер обмена;

o Select All – выбрать весь текст в активной вкладке;

o Clear – очистить окно вывода;

o Find – найти указанный для поиска текст по указанному критерию;

o Find Next – найти следующий принадлежащий критерию поиска текст;

o Find Previous – найти предыдущий принадлежащий критерию поиска текст.

Меню View:

o Scale – выбрать единицу измерения значений времени;

o Precision – выбрать число знаков после запятой для значений времени;

o Sort:

Function List – сортировка окна Function List;

Filter Pane – сортировка панели фильтра: можно сортировать по имени и по проценту затраченного времени;

o Font – изменить шрифт вывода исходного текста программы;

o Replace Source File – заменить файл с исходным текстом;

o Project Pane – вывод файлов сеанса в виде дерева;

o Output – окно вывода сообщений по работе тестируемой программы;

o Show Full Paths – отобразить полный путь для всех файлов;

o Toolbars – отобразить или скрыть панель инструментов;

o Go to Functions Details – отобразить окно Function Details для выбранной функции;

o Go to Source – вывод исходного текста для выбранной функции;

o Go to Child Details – вывод окна статистики дочерней функции;

o Go to Child Source – вывод исходного текста дочерней функции.

Меню  Project:

o Add File – добавить файл к проекту;

o Add Current File – добавить текущий файл к проекту;

o Remove File – удалить файл из проекта;

o Delete File – удалить файл из проекта и стереть с диска.

Меню Program:

o Start – запустить программу или проект;

o End – остановить программу или проект;

o Exclude Images – исключить файлы, если какие-то части программы, находящиеся в отдельных файлах (например, dll библиотеке), уже оптимизированы и по ним не нужно собирать статистику;

o Settings – окно настроек проекта:

Program Info – информация о программе: ее местоположении, текущем каталоге, аргументах программы и каталоге с исходным текстом программы.

True Time – включить/выключить режим использования квантовой технологии и ActiveX компоненты.

Меню Window:

o New Window – создать новую копию окна активной сессии (в копии окна можно открыть другую вкладку и одновременно на экране видеть две вкладки);

o Cascade – упорядочение окон как перекрывающих друг друга;

o Tile Horizontally – окна не перекрывают друг друга по горизонтали;

o Tile Vertically – окна не перекрывают друг друга по вертикали;

o Close All – закрыть все открытые данные сессии и файлы вывода.

Меню Help:

o Help Topics – отображение содержания справки;

o What is This? – просмотр подсказки к элементу окна программы;

o NuMega on the Web – перейти на Интернет сайт NuMega;

o About NuMega Tools – информация о программном продукте и его версии.

Кнопки программы True Time

* – открыть файл;

* – сохранить файл активной сессии;

* – копировать выделенный текст в буфер обмена;

* – распечатать отображенные вкладки для файла активной сессии;

* – предварительный просмотр;

 – поле для текста, который необходимо найти;

* – найти предыдущий и следующий указанный для поиска текст;

* – упорядочение окон как перекрывающих друг друга;

* – окна  не перекрывают друг друга по горизонтали;

* – окна  не перекрывают друг друга по вертикали;

* – просмотр справки к элементу окна программы;

* – показать или скрыть окно Project;

* – выбор установок проекта;

* – запустить приложение активного проекта;

* – остановить текущее приложение;

* – отобразить выбранную функцию в окне Function Details ;

 – отобразить/скрыть столбцы вкладок Function List или Source;

 – перейти на выбранную функцию (доступно только на вкладке Source).

Пример выполнения расчетного задания 2

Задание: Оптимизировать с помощью системы True Time программный модуль, написанный на языке C++.

В файле записаны числа. Каждое число обозначает номер отрезка. Необходимо найти отрезок, имеющий наименьшую длину.

Исходный текст основных функций

void swap(unsigned int *a, unsigned int *b)

{

int temp=*a; *a=*b; *b=temp;

}

void q_sort(int l, int u, unsigned int *x)

{

int i,j,m,t;

if (l<u)

            {

           

            swap(&x[l],&x[l+(u-l+1)/2]);

            t=x[l]; m=l;

            for (i=l+1; i<=u; i++)

                        if (x[i]<t)

                                   {

                                   m++; swap(&x[m],&x[i]);

                                   }

            swap (&x[l],&x[m]);

            q_sort (l,m-1,x);

            q_sort (m+1,u,x);

            }

}

void sort(unsigned int *x, int l)

{

int i,j,jm;

unsigned int min;

for (i=0;i<l-1;i++)

            {

            min=*(x+i);

            jm=i;

            for (j=i;j<l;j++)

                        if (min>*(x+j))

                                   {

                                   min=*(x+j);

                                   jm=j;

                                   }

            swap(&x[i],&x[jm]);

            }

}

void fillwithnulls(unsigned *x, int l)

{

int i;

for (i=0;i<l;i++)

            *(x+i)=0;

}

void CMy12345Dlg::OnOK()

{

int kk=3000;

unsigned int *m;

int i=0,d;

m=new unsigned int [kk];

FILE *in;

in=fopen("input.txt","r");

fillwithnulls(m,kk);

for (i=0;i<12000;i++)

            {

            fscanf(in,"%d",&d);

            m[d]++;

            }

sort(m,kk);

int res=0;

for (i=0;i<1200;i++)

            res+=int(pow(m[i],2));

}

На рис. 7.11 – 7.13 представлены статистические данные исходной программы.

Рис. 7.11. Статистические данные по функциям

Рис. 7.12. Суммарная информация о программе

Рис. 7.13. Детальная информация по функции sort

Из представленных статистических данных видно, что наибольшее время работы программы тратится на функции:

sort(unsigned int *,int) – сортировка массива;

CMy12345Dlg::OnOK(void) – обработка события нажатия кнопки;

fillwithnulls(unsigned int *,int) – обнуление элементов массива.

Функция sort выполняет сортировку массива методом пузырька. Так как данная функция занимает основное время работы программы, то изменим использованный метод сортировки на сортировку Хоара.

Первое изменение:

void q_sort(int l, int u, unsigned int *x)

{

int i,j,m,t;

if (l<u)

            {

           

            swap(&x[l],&x[l+(u-l+1)/2]);

            t=x[l]; m=l;

            for (i=l+1; i<=u; i++)

                        if (x[i]<t)

                                   {

                                   m++; swap(&x[m],&x[i]);

                                   }

            swap (&x[l],&x[m]);

            q_sort (l,m-1,x);

            q_sort (m+1,u,x);

            }

}

На рис. 7.14 – 7.16 представлены статистические данные программы после первого изменения.

Рис. 7.14. Статистические данные по функциям

Рис. 7.15. Суммарная информация о программе

Рис. 7.16. Статистические данные по строкам функции fillwithnulls

В результате первого изменения общее время работы программы значительно сократилось: с 3015 328,59 мкс до 648 438,10 мкс. Это свидетельствует о том, что второй алгоритм сортировки намного эффективнее исходного алгоритма. Функция сортировки теперь занимает третью позицию в окне статистических данных по функциям (рис. 7.11 и 7.14).

Теперь основное время работы программы тратится на функции:

CMy12345Dlg::OnOK(void) – обработка события нажатия кнопки;

fillwithnulls(unsigned int *, int) – обнуление элементов массива;

q_sort(int,int,unsigned int *) – сортировка массива.

Вторую позицию занимает функция fillwithnulls, в которой наибольшее время тратится на выполнение цикла (рис. 7.16). Заменим эту функцию системной функцией memset.

Второе изменение:

memset(m,0,sizeof(int)*kk);

На рис. 7.17 – 7.19 представлены статистические данные программы после второго изменения.

Рис. 7.17. Суммарная информация о программе

Рис. 7.18. Статистические данные функции memset

Рис. 7.19. Статистические данные по функциям

Функция fillwithnulls() выполнялась 1 984,42 мкс. Функция memset() выполнила ту же операцию за 55,07 мкс. Это изменение позволило еще сократить время выполнения программы: с 648 438,10 мкс до 641 255,99 мкс.

Теперь основную часть времени выполнения программы занимают системные функции (рис. 7.19). Попробуем заменить функцию swap – обмена значений элементов массива.

Третье изменение:

x[c]^=x[i]^=x[c]^=x[i];

На рис. 7.20 – 7.22 представлены статистические данные программы после третьего изменения.

Рис. 7.20. Статистические данные строки кода

Рис. 7.21. Суммарная информация о программе

Функция swap() выполнялась 1,92 мкс. Конструкция x[c]^=x[i]^=x[c]^=x[i] выполнила обмен значений за 0,93 мкс. Как видим, это изменение позволило еще сократить время выполнения программы. Теперь время работы программы составляет 620 958,75 мкс, что на 20 297,24 мкс меньше предыдущего времени. Посмотрим в окно «Function Details» (рис. 7.22) функции CMy12345Dlg::OnOK(void), срабатывающей при нажатии кнопки OK. Третью позицию среди дочерних функций занимает функция pow. Применим вместо данной функции обычное умножение.

Рис. 7.22. Детальная информация по функции CMy12345Dlg::OnOK(void)

Четвертое изменение:

res+=m[i]*m[i]

На рис. 7.23 – 7.25 представлены статистические данные программы после четвертого изменения.

Рис. 7.23. Статистические данные по функциям

Рис. 7.24. Статистические данные строки кода до и после изменения

Рис. 7.25. Суммарная информация о программе

Строка с системной функцией возведения в степень выполнялась 8 555,55 мкс, строка, содержащая обычное умножение, – 8 366,48 мкс (рис. 7.24). Время работы программы стало еще меньше и теперь составляет 610 008,05 мкс.

Вывод. В результате анализа статистических данных, полученных с помощью системы True Time, в программу были внесены изменения, улучшающие её работу и сокращающие время ее выполнения. В результате всех внесенных изменений время работы программы сократилось с 3015 328,59 мкс до 610 008,05 мкс, т.е. на 2 405 320,54 мкс, а это существенно.

Тесты для самоконтроля

1. True Time – инструмент анализа, предназначенный для сбора данных о производительности работы прикладных программ, написанных:

а) на языке Ассемблер;

б) на языке Visual C ++;

в) на любом языке программирования.

2. Процент времени, потраченного на функцию от времени, потраченного на сессию в окне Function Details в системе True Time –

а) % with Children;

б) % in Image;

в) % in Function.

3. Список файлов с исходными кодами программы в системе True Time отображается при выборе пункта

а)Top 20 Called Source Functions;

б) Source;

в)Top 20 Source Functions.

4. Вывод 20 функций, занявших наибольшее время выполнения в системе True Time, отображается при выборе пункта

а) Top 20 Called Source Functions;

б) Top 20 Source Functions;

в) Top 20 Functions.