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(). Возможно, это приведёт к некоторому засорению экрана ненужной информацией, зато позволит выиграть несколько долей секунды при выполнении;