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

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

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

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

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

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

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

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

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

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

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

ЛАБОРАТОРНАЯ РАБОТА №2

по курсу «Метрология, стандартизация и сертификация»

Студент группы 4ВС-1                                                                                     Лоушкин А.В.

Преподаватель:                                                                                                   Муратова Т.А.

Комсомольск-на-Амуре

2006


Тема:                       «Оптимизация программного кода с использованием TURBO PROFILER»

Цель работы:        Научиться оптимизировать программу, используя статистические данные

Задание:                  Оптимизировать с помощью системы Turbo Profiler программный модуль, написанный на языке СИ.

Выполнение:    В качестве оптимизируемой программы выбран пример, реализующий  метод интерполяции с равномерным шагом для нахождения узлов интерполяции. При сборе статистических данных в Turbo Profiler число запусков программы равнялось десяти.


Исходный текст программы(5(1).срр)

#include <stdio.h>

#include <conio.h>

#include <math.h>

float A,B;

float Xi[27],Yi[27];

float Ai[27],Bi[27],Ci[27],Di[27];

float Alpha[27],Betta[27];

float h;

int n;

float fn (float x)

{

return (1/(1+24*x*x));

}

float fsh (float x)

{

return (-(48*x)/pow(1+24*x*x,2));

}

float Sx (float x)

{

int i=int((x-A)/h);

return Ai[i]+Bi[i]*(x-Xi[i])+Ci[i]*(x-Xi[i])*(x-Xi[i])+Di[i]*(x-Xi[i])*(x-Xi[i])*(x-Xi[i]);

}

float Sshx (float x)

{

int i=int((x-A)/h);

return Bi[i]+2*Ci[i]*(x-Xi[i])+3*Di[i]*(x-Xi[i])*(x-Xi[i]);

}

void main()

{

clrscr();

float Ti=0;

A=-1,B=1;

n=26;

h=float(B-A)/n;

for(int i=0;i<=n;i++)

{

Xi[i] = A+i*h;

Yi[i] = fn(Xi[i]);

}

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

Ai[i]=Yi[i];

Alpha[1] = 0;

Betta[1]  = 0;

for(i=1;i<=n-1;i++)

{

Alpha[i+1] = (-1)/(4+Alpha[i]);

Ti         = 3*(Yi[i+1]-2*Yi[i]+Yi[i-1])/(h*h) ;

Betta[i+1] = (Ti-Betta[i])/(4+Alpha[i]);

}

Ci[n]=0;

for(i=n-1;i>=0;i--) { Ci[i] = Alpha[i+1]*Ci[i+1]+Betta[i+1]; }

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

{

Bi[i] = ((Yi[i+1]-Yi[i])/h)-(h*(Ci[i+1]+2*Ci[i])/3);

Di[i] = (Ci[i+1]-Ci[i])/(3*h);

}

Bi[n] = Bi[n-1]+2*Ci[n-1]*h+3*Di[n-1]*h*h;

Di[n] = Di[n-1];

printf ("Interpoliacionnaia tablica\n");

printf ("\t   x        f(x)        s(x)\n");

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

{

printf ("\t% .3f%12f%12f\n", Xi[i], Yi[i], Sx(Xi[i]));

}

float hp,N1=0,M1=0;

int K=100;

float xx[100],yy[100],zz[100];

hp=(B-A)/K;

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

{

xx[i] =A+i*hp;

yy[i] = fn(xx[i]);

}

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

zz[i] = Sx(xx[i]);

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

{

N1=fabs(yy[i]-zz[i]);

if(N1>M1) M1=N1;

}

printf("\P1:%f",M1);

double N2=0,M2=0;

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

{

xx[i] =A+i*hp;

yy[i] = fn(xx[i]);

}

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

zz[i] = Sx(xx[i]);

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

{

N2+=pow((yy[i]-zz[i]),2);

}

M2=sqrt(1.0/(K+1)*N2);

printf("\nP2:%2f",M2);

}

Статистические данные исходной программы(5(1).срр)

Рис. 1

Окно Файлы

Рис.2

По данным статистики, программа тратит больше всего времени на следующие области(рис.1):

Fn               функция

#5(1)#29     return

#5(1)#118   xx[i]=A+i*hp

#5(1)#17     выход из функции

#5(1)#28     i=int((x-A)/h)

#5(1)#119   yy[i]=fn(xx[i])

#5(1)#128   N2+=pow(yy[i]-zz[i],2)

#5(1)#108   N1=fabs(yy[i]-zz[i])

#5(1)#63     Alpha[i+1]=(-1)/(4+Alpha[i])

#5(1)#88     printf()

#5(1)#133   выход из программы

Со строчками #5(1)#29, #5(1)#17, #5(1)#133 сделать ничего не возможно.

Рис. 3

Анализируя данные по функциям (рис. 3), мы видим, что основное время затрачивается на функцию fn(). К сожалению, с ней сделать ничего нельзя. На втором месте по временным затратам идет функция printf(). Так что начнем изменения с потоков ввода/вывода.

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

Исходные строки                                                   Преобразованные строки

Printf(“Interpoliacionnaia tablica\n”)                         cout<<” Interpoliacionnaia tablica\n”

Printf(“\t   x        f(x)        s(x)\n”)                              cout<<” \t   x        f(x)        s(x)\n”

Printf(“\t% .3f%12f%12f\n", Xi[i], Yi[i], Sx(Xi[i]))  cout<<” "\t\n"<<Xi[i]<<Yi[i]<<Sx(Xi[i])”

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

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