Министерство образования и науки Российской Федерации
Государственное образовательное учреждение высшего профессионального образования
«Комсомольский-на-Амуре Государственный Технический Университет»
Факультет компьютерных технологий
Кафедра МОП ЭВМ
по курсу «МСиС»
Студент группы 4ВС-1: Рогозин В.А.
Преподаватель: Муратова Т.А.
Комсомольск-на-Амуре
Тема: оптимизация программного кода с использованием Turbo Profiler.
Цель - научиться:
- обнаруживать, где и на что программа расходует время;
- создавать аннотированный листинг исходного текста программы и статистический отчет о профилировании;
- запоминать статистические данные, полученные в результате профилирования и затем, после перерыва, возвращаться к работе с этими данными;
- анализировать статистику профилирования и исходный текст программы, находящиеся в соседних окнах.
Задание: Оптимизировать с помощью системы Turbo Profiler программный модуль, написанный на языке СИ.
Мы рассмотрим программу, которая показывает число изолированных стран, которые заданы с помощью матрицы смежности. Изолированными странами называются группы городов, такие, что между городами различных групп не существует летных сообщений. Найти число изолированных стран.
Исходный текст программы (msis2-0.cpp):
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int a[10][10]={0,0,1,0,1,0,0,0,0,0,
0,0,0,0,0,1,0,0,0,1,
1,0,0,0,1,0,0,0,0,0,
0,0,0,0,0,0,0,1,1,0,
1,0,1,0,0,0,0,0,0,0,
0,1,0,0,0,0,1,0,0,0,
0,0,0,0,0,1,0,0,0,1,
0,0,0,1,0,0,0,0,1,0,
0,0,0,1,0,0,0,1,0,0,
0,1,0,0,0,0,1,0,0,0};
int c[10]={0};
int b=1;
void recurs(int n)
{
for(int i=0;i<10;i++)
{
if((a[n][i]||a[i][n])&&(c[i]==0))
{
c[i]=b;
recurs(i);
}
}
}
void main()
{
clrscr();
c[0]=1;int i;
printf("изолированные страны состоят из вершин:\n");
for(i=0;i<10;i++)
{
recurs(i);
b++;
}
for(i=0;i<10;i++)
{int j;
for(j=0;j<10;j++)
{
if(c[j]==i) printf("%d ", j);
}
printf("\n");
}
}
Статистические данные исходной программы (msis2-0.cpp):
Turbo Profiler Version 2.1 Wed Oct 25 11:43:39 2006
Program: D:\KNASTU\Њ‘€‘\LAB2\MSIS2-0.EXE
Execution Profile
Total time: 0.0838 sec
% of total: 90 %
Run: 15 of 15
Filter: All
Show: Time and counts
Sort: Frequency Pass count: +++ Time: ***
#MSIS2-0#22 2850 46% |+++++++++++++++++++++++++++
0.0584 sec 76% |**********************************************
#MSIS2-0#44 1500 24% |++++++++++++++
0.0078 sec 10% |******
#MSIS2-0#46 150 2% |+
0.0067 sec 8% |*****
#MSIS2-0#34 15 <1% |
0.0010 sec 1% |
#MSIS2-0#37 150 2% |+
0.0003 sec <1% |
recurs 285 4% |++
0.0003 sec <1% |
#MSIS2-0#28 285 4% |++
0.0003 sec <1% |
#MSIS2-0#20 285 4% |++
0.0003 sec <1% |
#MSIS2-0#25 135 2% |+
0.0001 sec <1% |
#MSIS2-0#38 150 2% |+
0.0001 sec <1% |
#MSIS2-0#42 150 2% |+
0.0001 sec <1% |
#MSIS2-0#24 135 2% |+
0.0001 sec <1% |
#MSIS2-0#32 15 <1% |
0.0000 sec <1% |
#MSIS2-0#40 15 <1% |
0.0000 sec <1% |
#MSIS2-0#35 15 <1% |
0.0000 sec <1% |
#MSIS2-0#33 15 <1% |
0.0000 sec <1% |
Обращение к файлам:
Первое изменение:
Неэффективной строкой является строка 22:
#MSIS2-0#22 2850 46% |+++++++++++++++++++++++++++
0.0584 sec 76% |**********************************************
В строке 22 задаётся условие проверки if((a[n][i]||a[i][n])&&(c[i]==0)). Заменим условие проверки матрицы. Т.е. если раньше мы на каждом шаге выполняли проверку матрицы и по столбцу, и по строке, то сейчас будем проверять только по строке.
Исходная строка:
if((a[n][i]||a[i][n])&&(c[i]==0))
Измененная строка:
if(a[i][n]&&c[i]==0)
Статистические данные после первого изменения программы (msis2-1.cpp):
Turbo Profiler Version 2.1 Wed Oct 25 12:04:34 2006
Program: D:\KNASTU\Њ‘€‘\LAB2\MSIS2-1.EXE
Execution Profile
Total time: 0.0299 sec
% of total: 74 %
Run: 15 of 15
Filter: All
Show: Time and counts
Sort: Frequency Pass count: +++ Time: ***
#MSIS2-1#44 1500 24% |++++++++++++++++++++++++
0.0091 sec 40% |****************************************
#MSIS2-1#46 150 2% |++
0.0070 sec 31% |******************************
#MSIS2-1#22 2850 46% |++++++++++++++++++++++++++++++++++++++++++++++
0.0030 sec 13% |*************
#MSIS2-1#34 15 <1% |
0.0009 sec 4% |****
#MSIS2-1#37 150 2% |++
0.0003 sec 1% |*
#MSIS2-1#28 285 4% |++++
0.0002 sec 1% |*
recurs 285 4% |++++
0.0002 sec 1% |*
#MSIS2-1#20 285 4% |++++
0.0002 sec 1% |*
#MSIS2-1#25 135 2% |++
0.0002 sec <1% |
#MSIS2-1#42 150 2% |++
0.0001 sec <1% |
#MSIS2-1#38 150 2% |++
0.0001 sec <1% |
#MSIS2-1#24 135 2% |++
0.0001 sec <1% |
#MSIS2-1#32 15 <1% |
0.0000 sec <1% |
#MSIS2-1#48 15 <1% |
0.0000 sec <1% |
#MSIS2-1#33 15 <1% |
0.0000 sec <1% |
#MSIS2-1#35 15 <1% |
0.0000 sec <1% |
#MSIS2-1#22 2850 46% |++++++++++++++++++++++++++++++++++++++++++++++
0.0030 sec 13% |*************
После первого изменения строка 22 стала работать быстрее, время её выполнения снизилось с 0.0584 sec до 0.0030 sec , так же это сказалось на общем времени выполнения программы. Выполнение программы уменьшилось с 0.0838 sec до 0.0299 sec.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.