Оптимизация программного кода с использованием TURBO PROFILER. Оптимизация программы с использованием статистических данных

Страницы работы

Содержание работы

Министерство образования и науки Российской Федерации

Федеральное агентство по образованию

Государственное образовательное учреждение

высшего профессионального образования

«Комсомольский-на-Амуре государственный

технический университет»

Факультет компьютерных технологий

Кафедра «МОП ЭВМ»

ЛАБОРАТОРНАЯ РАБОТА №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,&regs,&regs);

regs.h.ah=2;

regs.h.dl=0;

regs.h.dh=0;

regs.h.bh=0;

int86(0x10,&regs,&regs);

}

Статистические данные после изменения(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,&regs,&regs);

Изменим код Assembler на следующий:

void cls1()

{

union REGS regs;

regs.h.ah=7;

regs.h.al=0;

regs.h.dl=80;

regs.h.bh=7;

int86(0x10,&regs,&regs);

}

Рис. 2.

По данным статистики время выполнения программы сократилось до 0.0238 сек.(Рис. 2.)

Вывод: Профилирование программ в системе Turbo Profiler с целью повышения их быстродействия - это динамичный интерактивный процесс.

Работая в системе Turbo Profiler, собирая статистику, анализируя данные о процессе выполнения, мы смогли выявить неэффективные места в программе, а далее модифицировать их для получения приемлемого результата. В итоге, в результате трех изменений, время работы программы уменьшилось примерно в 3 раза, в результате чего программный модуль стал менее требователен к ресурсам ПЭВМ.

Похожие материалы

Информация о работе