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

4. Профилирование программ «Main_p» и «Main_c»

Для получения корректных результатов профилирования необходимо исключить влияние процедур ввода параметров от пользователя. Таким образом, в качестве «зон» профилирования были выбраны строчки вычислительных процедур.

Исходная программа на Паскале показала следующие результаты:

Turbo Profiler Version 2.2 Thu Apr 28 00:12:51 2005

Program: E:\BP\BIN\LAB1.EXE File LAB1.PAS

Time Counts

program simp;

const tol = 1.0E-4;

var sum,upper,lower, erf, twopi : real;

j : integer;

function fx(x: real): real;

0.0582 900 begin

0.0009 900 fx:=exp(-x*x)

0.0034 900 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;

0.0001 100 begin

0.0019 100 pieces:=2;

0.0001 100 delta_x:=(upper-lower)/pieces;

0.0003 100 odd_sum:=fx(lower+delta_x);

0.0000 100 even_sum:=0.0;

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

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

0.0135 100 writeln(pieces:5,sum);

repeat

0.0001 200 pieces:=pieces*2;

0.0013 200 sum1:=sum;

0.0551 200 delta_x:=(upper-lower)/pieces;

0.0006 200 even_sum:=even_sum+odd_sum;

0.0003 200 odd_sum:=0.0;

0.0002 200 for i:=1 to pieces div 2 do

begin

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

0.0053 600 odd_sum:=odd_sum+fx(x)

0.0017 600 end;

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

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

0.0001 100 end;

0.0012 1 begin

0.0000 1 for j:=1 to 100 do

begin

0.0001 100 twopi:=2.0/sqrt(pi);

0.0001 100 lower:=0.0;

{readln(upper); }

0.0002 100 upper := 1;

0.0000 100 if upper >= 0.0 then

begin

0.0001 100 simps(lower,upper,tol,sum);

0.0550 100 erf:=twopi*sum;

0.0125 100 writeln(upper:7:2, erf:12:8)

end

0.0000 100 end

0.0010 1 end.

Исходная программа на Си ++ показала следующие результаты :

Turbo Profiler Version 2.1 Tue May 03 14:09:00 2005

Program: C:\1351_0~1\LAB2\CPPVER\LAB1.EXE File LAB1.CPP

Time Counts

program simp;

const tol = 1.0E-4;

var sum,upper,lower, erf, twopi : real;

j : integer;

function fx(x: real): real;

0.0556 900 begin

0.0009 900 fx:=exp(-x*x)

0.0008 900 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;

0.0000 100 begin

0.0000 100 pieces:=2;

0.0000 100 delta_x:=(upper-lower)/pieces;

0.0002 100 odd_sum:=fx(lower+delta_x);

0.0000 100 even_sum:=0.0;

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

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

repeat

0.0001 200 pieces:=pieces*2;

0.0001 200 sum1:=sum;

0.0001 200 delta_x:=(upper-lower)/pieces;

0.0001 200 even_sum:=even_sum+odd_sum;

0.0001 200 odd_sum:=0.0;

0.0001 200 for i:=1 to pieces div 2 do

begin

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

0.0011 600 odd_sum:=odd_sum+fx(x)

0.0005 600 end;

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

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

0.0550 100 end;

0.0011 1 begin

0.0002 1 clrscr();

0.0000 1 for j:=1 to 100 do

begin

0.0000 100 twopi:=2.0/sqrt(pi);

0.0000 100 lower:=0.0;

0.0000 100 upper := 1;

0.0000 100 if upper >= 0.0 then

begin

0.0000 100 simps(lower,upper,tol,sum);

0.0000 100 erf:=twopi*sum;

end

0.0549 100 end

0.0010 1 end.

Можно заметить, что программа на Си ++ выполняется медленнее, чем программа на Паскале. Можно также заметить, что оптимизировать в этих программах практически нечего, значительного выигрыша по времени получить не удастся

. Для обеих программ можно предложить следующие незначительные улучшения:

  • исключить вызов функции ClrScr(). Возможно, это приведёт к некоторому засорению экрана ненужной информацией, зато позволит выиграть несколько долей секунды при выполнении;

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