Министерство образования и науки Российской Федерации
Федеральное агентство по образованию
Государственное образовательное учреждение
высшего профессионального образования
«Комсомольский-на-Амуре государственный
технический университет»
Факультет компьютерных технологий
Кафедра «МОП ЭВМ»
ЛАБОРАТОРНАЯ РАБОТА №2
по курсу «Метрология, стандартизация и сертификация»
Студент группы 4ВС-1 Малыгин А.С.
Преподаватель: Муратова Т.А.
Комсомольск-на-Амуре
2006
Тема: «Оптимизация программного кода с использованием TURBO PROFILER»
Цель работы: Научиться оптимизировать программу, используя статистические данные
Задание: Оптимизировать с помощью системы Turbo Profiler программный модуль, написанный на языке СИ.
Выполнение: В качестве оптимизируемой программы была выбрана программа нахождения суммы чисел, стоящих на нечетных позициях. При сборе статистических данных в Turbo Profiler число запусков программы равнялось 20.
Исходный текст программы (Msis1.срр)
#include <stdio.h> // Подключение библиотек
#include <conio.h>
int f(long n)
{
long x,n1,k=0;
do
{
n1=n/10;
x=n-n1*10;
n=n1;
k++;
} while (n!=0);
return k;
}
void main(void)
{
clrscr(); // Очистка экрана
long n=34545676,a,i; // Объявление переменных
long s=0,k=0;
a=n;
/*Цикл подсчета цифр в числе*/
if (k%2==1) //Условие нечетного кол-ва
i=1; //цифр в числе
else
i=10;
while (a/i!=0) //Цикл подсчета цифр
{
s+=a%(10*i)/I;
i*=100;
}
printf(“\nSumma chisel na nechetnoi pozicii ravna %ld”,s);
}
Статистические данные исходной программы
Рис. 1.
По данным статистики программа тратит больше всего времени на следующие области (рис.1):
#MSIS1#37 0.0572 sec 91|**********************************************
#MSIS1#19 0.0047 sec 7% |***
Судя по этим данным неэффективной строкой является строка 37.
printf("\nSumma chisel na nechetnoi pozicii ravna %ld",s);
Внесем первое изменение и заменим оператор printf на сprintf и уберем символ перевода на новую строку:
сprintf("Summa chisel na nechetnoi pozicii ravna %ld",s);
Статистические данные после изменения(Msis2.cpp)
После первого изменения строка стала работать гораздо эффективнее. Время работы строки сократилось с 0.0572 сек. до 0.0022 сек. Так же это сказалось на общем времени выполнения программы. Выполнение программы уменьшилось с 0.0847 sec до 0.0389 sec.
Так как в данном случае не используется стандартный поток вывода, то окно Files не будет содержать записей.
Из данных статистики видно, что большое время на вызов занимает строка №19
В этой строке происходит очистка экрана функцией clrscr().
Внесем второе изменение путем замены этой функции на код ASSEMBLER.
void cls1()
{
union REGS regs;
regs.h.ah=6;
regs.h.al=0;
regs.h.ch=0;
regs.h.cl=0;
regs.h.dh=24;
regs.h.dl=79;
regs.h.bh=7;
int86(0x10,®s,®s);
regs.h.ah=2;
regs.h.dl=0;
regs.h.dh=0;
regs.h.bh=0;
int86(0x10,®s,®s);
}
Статистические данные после изменения(Msis4.cpp)
Turbo Profiler Version 2.1 Sat Nov 18 01:24:37 2006
Program: D:\BORLANDC\BIN\MSIS4.EXE
Execution Profile
Total time: 0.0306 sec
% of total: 27 %
Run: 20 of 20
Filter: All
Show: Time
Sort: Frequency
#MSIS4#43 0.0040 sec 48% |**********************************************
#MSIS4#31 0.0022 sec 26% |*************************
#MSIS4#49 0.0006 sec 7% |*******
#MSIS4#17 0.0001 sec 1% |*
#MSIS4#16 0.0001 sec 1% |*
#MSIS4#14 0.0001 sec 1% |*
#MSIS4#18 0.0001 sec 1% |*
#MSIS4#15 0.0001 sec 1% |*
#MSIS4#25 0.0000 sec 1% |
#MSIS4#45 0.0000 sec <1% |
#MSIS4#47 0.0000 sec <1% |
#MSIS4#19 0.0000 sec <1% |
Время выполнения строки №19 очень сильно сократилось. Выполнение программы уменьшилось на 0.0002 секунды.
Строчки № 43 и №49 содержат код Assembler:
int86(0x10,®s,®s);
Изменим код Assembler на следующий:
void cls1()
{
union REGS regs;
regs.h.ah=7;
regs.h.al=0;
regs.h.dl=80;
regs.h.bh=7;
int86(0x10,®s,®s);
}
Рис. 2.
По данным статистики время выполнения программы сократилось до 0.0238 сек.(Рис. 2.)
Вывод: Профилирование программ в системе Turbo Profiler с целью повышения их быстродействия - это динамичный интерактивный процесс.
Работая в системе Turbo Profiler, собирая статистику, анализируя данные о процессе выполнения, мы смогли выявить неэффективные места в программе, а далее модифицировать их для получения приемлемого результата. В итоге, в результате трех изменений, время работы программы уменьшилось примерно в 3 раза, в результате чего программный модуль стал менее требователен к ресурсам ПЭВМ.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.