Скачиваний:
18
Добавлен:
01.05.2014
Размер:
129.02 Кб
Скачать

3. Профилирование полного времени выполнения программ «Simps.Pas» и «Simps.Cpp»

В ходе выполнения лабораторной работы №1 на языках Паскаль и Си++ была разработана программа, выполняющая интерполяцию данных по методу наименьших квадратов. В ходе выполнения лабораторной работы №2 были проведены некоторые улучшения этой программы и увеличено её быстродействие. Таким образом, в нашем распоряжении имеются две версии программы для каждого языка программирования: исходная и оптимизированная. Оценим общее время выполнения каждой из программ с помощью профилировщика «Sampler».

Для достижения поставленной цели необходимо внести изменения в программы. Для программ на языке Паскаль необходимо добавить модуль «Sampler» в раздел «uses» основной программы и разместить метки SAMPLE(‘simps.pas’,N) после оператора BEGIN, открывающего тело программы и перед оператором END, закрывающем его. Для программ на языке Си++ необходимо добавить директиву «#include “Sampler.h”» в начало файла и разместить метки SAMPLE после открывающей и перед закрывающей фигурными скобками функции Main.

Результаты профилирования всех версий программ приведены ниже:

Профилирование программы интегрирования методом Симпсона

(измерение времени полного выполнения программы)

На С++

#include <iostream.h>

#include <conio.h>

#include <stdio.h>

#include <math.h>

#include "Sampler.h"

const double tol = 1.0E-4;

double sum, upper, lower, erf, twopi;

double fx(double x)

{

return exp(-x * x);

}

double simps(double lower,double upper,double tol)

{

int i;

double x,delta_x,even_sum,odd_sum,end_sum, sum1;

int pieces;

double sum;

pieces = 2;

delta_x = (upper - lower) / pieces;

odd_sum = fx(lower + delta_x);

even_sum = 0.0;

end_sum = fx(lower) + fx(upper);

sum = (end_sum + 4.0 * odd_sum) * delta_x / 3.0;

printf("%d", pieces);

printf("%f", sum);

do

{

pieces = pieces * 2;

sum1 = sum;

delta_x = (upper - lower) / pieces;

even_sum = even_sum + odd_sum;

odd_sum = 0.0;

for (i = 1; i <= (pieces / 2); i++)

{

x = lower + delta_x * (2.0 * i - 1.0);

odd_sum = odd_sum + fx(x);

}

sum = (end_sum + 4.0 * odd_sum + 2.0 * even_sum) * delta_x / 3.0;

}

while (abs(sum - sum1) > abs(tol * sum1));

return sum;

}

void main ()

{

SAMPLE;//49

double res;

double pi = 3.14159265359;

twopi = 2.0 / sqrt(pi);

lower = 0.0;

upper = 1;

if (upper >= 0.0)

{

res = simps(lower,upper,tol);

erf = twopi * res;

printf("%f", upper);

printf("%f\n", erf);

}

SAMPLE;//62

}

Таблица с результатами измерений ( используется 2 из 416 записей )

----------------------------------------------------------------------

Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)

----------------------------------------------------------------------

1 : 49 1 : 62 115,35 1 115,35

Профилирование программы интегрирования методом Симпсона

(измерение времен выполнения функциональных участков)

#include <iostream.h>

#include <conio.h>

#include <stdio.h>

#include <math.h>

#include "Sampler.h"

const double tol = 1.0E-4;

double sum, upper, lower, erf, twopi;

double fx(double x)

{

return exp(-x * x);

}

double simps(double lower,double upper,double tol)

{

int i;

double x,delta_x,even_sum,odd_sum,end_sum, sum1;

int pieces;

double sum;

pieces = 2;

delta_x = (upper - lower) / pieces;

odd_sum = fx(lower + delta_x);

even_sum = 0.0;

end_sum = fx(lower) + fx(upper);

sum = (end_sum + 4.0 * odd_sum) * delta_x / 3.0;

printf("%d", pieces);

printf("%f", sum);

do

{

pieces = pieces * 2;

sum1 = sum;

delta_x = (upper - lower) / pieces;

even_sum = even_sum + odd_sum;

odd_sum = 0.0;

for (i = 1; i <= (pieces / 2); i++)

{

x = lower + delta_x * (2.0 * i - 1.0);

odd_sum = odd_sum + fx(x);

}

sum = (end_sum + 4.0 * odd_sum + 2.0 * even_sum) * delta_x / 3.0;

}

while (abs(sum - sum1) > abs(tol * sum1));

return sum;

}

void main ()

{

double res;

double pi = 3.14159265359;

SAMPLE;//51

twopi = 2.0 / sqrt(pi);

SAMPLE;//53

lower = 0.0;

SAMPLE;//55

upper = 1;

if (upper >= 0.0)

{

SAMPLE;//60

res = simps(lower,upper,tol);

SAMPLE;//62

erf = twopi * res;

SAMPLE;//64

printf("%f", upper);

SAMPLE;//66

printf("%f\n", erf);

SAMPLE;//68

}

SAMPLE;//70

}

Таблица с результатами измерений ( используется 10 из 416 записей )

----------------------------------------------------------------------

Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)

----------------------------------------------------------------------

1 : 51 1 : 53 3.75 1 3.75

----------------------------------------------------------------------

1 : 53 1 : 55 1.68 1 1.68

----------------------------------------------------------------------

1 : 55 1 : 60 0.84 1 0.84

----------------------------------------------------------------------

1 : 60 1 : 62 58.14 1 58.14

----------------------------------------------------------------------

1 : 62 1 : 64 0.84 1 0.84

----------------------------------------------------------------------

1 : 64 1 : 66 28.35 1 28.35

----------------------------------------------------------------------

1 : 66 1 : 68 23.44 1 23.44

----------------------------------------------------------------------

1 : 68 1 : 70 0.00 1 0.00

----------------------------------------------------------------------

Вывод: Наиболее ресурсоемкая операция - вывод на экран. Удалим эти операции

(измерение времени полного выполнения программы)

#include <iostream.h>

#include <conio.h>

#include <stdio.h>

#include <math.h>

#include "Sampler.h"

const double tol = 1.0E-4;

double sum, upper, lower, erf, twopi;

double fx(double x)

{

return exp(-x * x);

}

double simps(double lower,double upper,double tol)

{

int i;

double x,delta_x,even_sum,odd_sum,end_sum, sum1;

int pieces;

double sum;

pieces = 2;

delta_x = (upper - lower) / pieces;

odd_sum = fx(lower + delta_x);

even_sum = 0.0;

end_sum = fx(lower) + fx(upper);

sum = (end_sum + 4.0 * odd_sum) * delta_x / 3.0;

printf("%d", pieces);

printf("%f", sum);

do

{

pieces = pieces * 2;

sum1 = sum;

delta_x = (upper - lower) / pieces;

even_sum = even_sum + odd_sum;

odd_sum = 0.0;

for (i = 1; i <= (pieces / 2); i++)

{

x = lower + delta_x * (2.0 * i - 1.0);

odd_sum = odd_sum + fx(x);

}

sum = (end_sum + 4.0 * odd_sum + 2.0 * even_sum) * delta_x / 3.0;

}

while (abs(sum - sum1) > abs(tol * sum1));

return sum;

}

void main ()

{

double res;

double pi = 3.14159265359;

SAMPLE;//49

twopi = 2.0 / sqrt(pi);

lower = 0.0;

upper = 1;

if (upper >= 0.0)

{

res = simps(lower,upper,tol);

erf = twopi * res;

}

SAMPLE;//58

}

Таблица с результатами измерений ( используется 2 из 416 записей )

----------------------------------------------------------------------

Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)

----------------------------------------------------------------------

1 : 49 1 : 58 65.17 1 65.17

------------------------------------------------------------------------------------------------------------------------------

Профилирование оптимизированной программы интегрирования методом Симпсона

(измерение времен выполнения функциональных участков)

#include <iostream.h>

#include <conio.h>

#include <stdio.h>

#include <math.h>

#include "Sampler.h"

const double tol = 1.0E-4;

double sum, upper, lower, erf, twopi;

double fx(double x)

{

return exp(-x * x);

}

double simps(double lower,double upper,double tol)

{

int i;

double x,delta_x,even_sum,odd_sum,end_sum, sum1;

int pieces;

double sum;

pieces = 2;

delta_x = (upper - lower) / pieces;

odd_sum = fx(lower + delta_x);

even_sum = 0.0;

end_sum = fx(lower) + fx(upper);

sum = (end_sum + 4.0 * odd_sum) * delta_x / 3.0;

printf("%d", pieces);

printf("%f", sum);

do

{

pieces = pieces * 2;

sum1 = sum;

delta_x = (upper - lower) / pieces;

even_sum = even_sum + odd_sum;

odd_sum = 0.0;

for (i = 1; i <= (pieces / 2); i++)

{

x = lower + delta_x * (2.0 * i - 1.0);

odd_sum = odd_sum + fx(x);

}

sum = (end_sum + 4.0 * odd_sum + 2.0 * even_sum) * delta_x / 3.0;

}

while (abs(sum - sum1) > abs(tol * sum1));

return sum;

}

void main ()

{

double res;

double pi = 3.14159265359;

SAMPLE;//51

twopi = 2.0 / sqrt(pi);

SAMPLE;//53

lower = 0.0;

SAMPLE;//55

upper = 1;

if (upper >= 0.0)

{

SAMPLE;//60

res = simps(lower,upper,tol);

SAMPLE;//62

erf = twopi * res;

SAMPLE;//64

}

SAMPLE;//62

}

Таблица с результатами измерений ( используется 8 из 416 записей )

----------------------------------------------------------------------

Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)

----------------------------------------------------------------------

1 : 51 1 : 53 2.51 1 2.51

----------------------------------------------------------------------

1 : 53 1 : 55 0.84 1 0.84

----------------------------------------------------------------------

1 : 55 1 : 60 0.84 1 0.84

----------------------------------------------------------------------

1 : 60 1 : 62 57.78 1 57.78

----------------------------------------------------------------------

1 : 62 1 : 64 2.68 1 1.68

----------------------------------------------------------------------

1 : 64 1 : 66 0.00 1 0.00

----------------------------------------------------------------------

Профилирование программы интегрирования методом Симпсона

(измерение времени полного выполнения программы)

На Паскале

uses sampler;

const FName : string = 'lab1.pas';

const tol = 1.0E-4;

var sum,upper,lower,

erf,twopi : real;

function fx(x: real): real;

begin

fx:=exp(-x*x)

end;

procedure simps(lower,upper,tol : real; var sum : real);

var i : integer;

x,delta_x,even_sum,

odd_sum,end_sum,

sum1 : real;

pieces : integer;

begin

pieces:=2;

delta_x:=(upper-lower)/pieces;

odd_sum:=fx(lower+delta_x);

even_sum:=0.0;

end_sum:=fx(lower)+fx(upper);

sum:=(end_sum+4.0*odd_sum)*delta_x/3.0;

writeln(pieces:5,sum);

repeat

pieces:=pieces*2;

sum1:=sum;

delta_x:=(upper-lower)/pieces;

even_sum:=even_sum+odd_sum;

odd_sum:=0.0;

for i:=1 to pieces div 2 do

begin

x:=lower+delta_x*(2.0*i-1.0);

odd_sum:=odd_sum+fx(x)

end;

sum:=(end_sum+4.0*odd_sum+2.0*even_sum)*delta_x/3.0;

until abs(sum-sum1)<=abs(tol*sum1)

end;

begin

Sample(FName,1);

twopi := 2.0/sqrt(pi);

lower := 0.0;

upper := 1;

writeln;

writeln('Erf? ');

if upper >= 0.0 then

begin

simps(lower,upper,tol,sum);

erf:=twopi*sum;

writeln('Erf of ',upper:7:2,', is ',erf:12:8)

end;

Sample(FName,2);

end.

Таблица с результатами измерений ( используется 2 из 416 записей )

----------------------------------------------------------------------

Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)

----------------------------------------------------------------------

1 : 1 1 : 2 255.23 1 255.23

------------------------------------------------------------------------------

Профилирование программы интегрирования методом Симпсона

(измерение времен выполнения функциональных участков)

uses sampler;

const FName : string = 'lab1.pas';

const tol = 1.0E-4;

var sum,upper,lower,

erf,twopi : real;

function fx(x: real): real;

begin

fx:=exp(-x*x)

end;

procedure simps(lower,upper,tol : real; var sum : real);

var i : integer;

x,delta_x,even_sum,

odd_sum,end_sum,

sum1 : real;

pieces : integer;

begin

pieces:=2;

delta_x:=(upper-lower)/pieces;

odd_sum:=fx(lower+delta_x);

even_sum:=0.0;

end_sum:=fx(lower)+fx(upper);

sum:=(end_sum+4.0*odd_sum)*delta_x/3.0;

writeln(pieces:5,sum);

repeat

pieces:=pieces*2;

sum1:=sum;

delta_x:=(upper-lower)/pieces;

even_sum:=even_sum+odd_sum;

odd_sum:=0.0;

for i:=1 to pieces div 2 do

begin

x:=lower+delta_x*(2.0*i-1.0);

odd_sum:=odd_sum+fx(x)

end;

sum:=(end_sum+4.0*odd_sum+2.0*even_sum)*delta_x/3.0;

until abs(sum-sum1)<=abs(tol*sum1)

end;

begin

Sample(FName,1);

twopi := 2.0/sqrt(pi);

Sample(FName,2);

lower := 0.0;

Sample(FName,3);

upper := 1;

Sample(FName,4);

writeln;

Sample(FName,5);

writeln('Erf? ');

Sample(FName,6);

if upper >= 0.0 then

begin

Sample(FName,7);

simps(lower,upper,tol,sum);

Sample(FName,8);

erf:=twopi*sum;

Sample(FName,9);

writeln('Erf of ',upper:7:2,', is ',erf:12:8);

Sample(Fname,10);

end;

Sample(Fname,11);

end.

Таблица с результатами измерений ( используется 11 из 416 записей )

----------------------------------------------------------------------

Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)

----------------------------------------------------------------------

1 : 1 1 : 2 6.00 1 6.00

----------------------------------------------------------------------

1 : 2 1 : 3 3.02 1 3.02

----------------------------------------------------------------------

1 : 3 1 : 4 0.02 1 0.02

----------------------------------------------------------------------

1 : 4 1 : 5 25.49 1 25.49

----------------------------------------------------------------------

1 : 5 1 : 6 33.11 1 33.11

----------------------------------------------------------------------

1 : 6 1 : 7 0.20 1 0.20

----------------------------------------------------------------------

1 : 7 1 : 8 125.57 1 125.57

----------------------------------------------------------------------

1 : 8 1 : 9 0.24 1 0.24

----------------------------------------------------------------------

1 : 9 1 : 10 57.15 1 57.15

----------------------------------------------------------------------

1 : 10 1 : 11 0.05 1 0.05

Вывод: Оптимизация такая же как в программе на С++.

Профилирование оптимизированной программы интегрирования методом Симпсона

(измерение времени полного выполнения программы)

uses sampler;

const FName : string = 'lab1.pas';

const tol = 1.0E-4;

var sum,upper,lower,

erf,twopi : real;

function fx(x: real): real;

begin

fx:=exp(-x*x)

end;

procedure simps(lower,upper,tol : real; var sum : real);

var i : integer;

x,delta_x,even_sum,

odd_sum,end_sum,

sum1 : real;

pieces : integer;

begin

pieces:=2;

delta_x:=(upper-lower)/pieces;

odd_sum:=fx(lower+delta_x);

even_sum:=0.0;

end_sum:=fx(lower)+fx(upper);

sum:=(end_sum+4.0*odd_sum)*delta_x/3.0;

writeln(pieces:5,sum);

repeat

pieces:=pieces*2;

sum1:=sum;

delta_x:=(upper-lower)/pieces;

even_sum:=even_sum+odd_sum;

odd_sum:=0.0;

for i:=1 to pieces div 2 do

begin

x:=lower+delta_x*(2.0*i-1.0);

odd_sum:=odd_sum+fx(x)

end;

sum:=(end_sum+4.0*odd_sum+2.0*even_sum)*delta_x/3.0;

until abs(sum-sum1)<=abs(tol*sum1)

end;

begin

Sample(FName,1);

twopi := 2.0/sqrt(pi);

lower := 0.0;

upper := 1;

if upper >= 0.0 then

begin

simps(lower,upper,tol,sum);

erf:=twopi*sum;

end;

Sample(FName,2);

end.

Таблица с результатами измерений ( используется 2 из 416 записей )

----------------------------------------------------------------------

Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)

----------------------------------------------------------------------

1 : 1 1 : 2 147.25 1 147.27

----------------------------------------------------------------------

Профилирование оптимизированной программы интегрирования методом Симпсона

(измерение времен выполнения функциональных участков)

uses sampler;

const FName : string = 'lab1.pas';

const tol = 1.0E-4;

var sum,upper,lower,

erf,twopi : real;

function fx(x: real): real;

begin

fx:=exp(-x*x)

end;

procedure simps(lower,upper,tol : real; var sum : real);

var i : integer;

x,delta_x,even_sum,

odd_sum,end_sum,

sum1 : real;

pieces : integer;

begin

pieces:=2;

delta_x:=(upper-lower)/pieces;

odd_sum:=fx(lower+delta_x);

even_sum:=0.0;

end_sum:=fx(lower)+fx(upper);

sum:=(end_sum+4.0*odd_sum)*delta_x/3.0;

writeln(pieces:5,sum);

repeat

pieces:=pieces*2;

sum1:=sum;

delta_x:=(upper-lower)/pieces;

even_sum:=even_sum+odd_sum;

odd_sum:=0.0;

for i:=1 to pieces div 2 do

begin

x:=lower+delta_x*(2.0*i-1.0);

odd_sum:=odd_sum+fx(x)

end;

sum:=(end_sum+4.0*odd_sum+2.0*even_sum)*delta_x/3.0;

until abs(sum-sum1)<=abs(tol*sum1)

end;

begin

Sample(FName ,1);

twopi := 2.0/sqrt(pi);

Sample(FName,2);

lower := 0.0;

Sample(FName,3);

upper := 1;

Sample(FName,4);

if upper >= 0.0 then

begin

Sample(FName,5);

simps(lower,upper,tol,sum);

Sample(FName,6);

erf:=twopi*sum;

Sample(FName,7);

end;

Sample(FName,8);

end.

Таблица с результатами измерений ( используется 8 из 416 записей )

----------------------------------------------------------

Исх.Поз. Прием.Поз. Общее время(мкс) Кол-во прох. Среднее время(мкс)

-----------------------------------------------------------

1 : 1 1 : 2 8.02 1 8.02

----------------------------------------------------------------------

1 : 2 1 : 3 2.04 1 2.04

----------------------------------------------------------------------

1 : 3 1 : 4 0.02 1 0.02

----------------------------------------------------------------------

1 : 4 1 : 5 4.26 1 4.26

---------------------------------------------------------------------

1 : 5 1 : 6 127.47 1 127.47

---------------------------------------------------------------------

1 : 6 1 : 7 2.54 1 2.54

----------------------------------------------------------------------

1 : 7 1 : 8 0.02 1 0.02

----------------------------------------------------------------------

Вывод

Проанализировав характеристики программы, была проведена оптимизация, что сократило общее время ее выполнения. Время работы программы на С++ сократилось с 115.35 мкс до 65.17 мкс. Время работы программы на Паскале сократилось с 255.2301 мкс до 147.25 мкс. Временные характеристики, полученные TurboProfiler в несколько раз больше временных характеристик, полученных SAMPLER. SAMPLER позволяет измерять характеристики программ с незначительными дополнительными накладными расходами, влияющих на качество профилирования.

Соседние файлы в папке Лабораторные работы №2 и 3