Скачиваний:
23
Добавлен:
01.05.2014
Размер:
158.21 Кб
Скачать
  1. Операционная графовая модель

Построенная ОГМ представлена в виде графа с нагруженными вершинами. Фрагменты программы, соответствующие вершинам указаны на графе и в таблице 2. В графе имеется три ветвления, в вершинах 3, 4 и 8. Оценивание вероятностей выбора ветви представлено в таблице 1.

Таблица 1. Оценивание вероятностей выбора ветвей

Вершина

Вероятности выбора ветвей

Обоснование

3

и

В данном блоке принятия решения исход события зависит от входных данных. Проверяемое условие истинно только тогда, когда входное значение . Если (точность нахождения корня) и величина x распределена равномерно на отрезке [‑100,100], то вероятность .

4

0,5 и 0,5

Исход события зависит от того, является ли входное значение x (которое удовлетворяет ) положительным или отрицательным. Так как величина x распределена равномерно на отрезке [‑100,100], то вероятность p=0,5.

8

0,9 и 0,1

Данное ветвление соответствует проверке выхода из цикла. Если считать, что среднее количество повторений тела цикла равно , то вероятность выхода из цикла равна (цикл с постусловием), а вероятность продолжения цикла

Для оценки среднего количества повторений тела цикла, программа многократно запускалась с различными входными данными. Входное значение x менялось в диапазоне [-100; 100] с шагом 0,01. Среднее арифметическое количества повторений получилось равным 9,03295 ≈ 9. Наименьшее значение равно 1 (когда x = 1,414214), наибольшее равно 26 (когда x = 0 или близко к 0). При x = 100, количество повторений равно 11.

В качестве параметров, характеризующих потребление ресурсов используются времена выполнения соответствующих участков программы. Оценка этих времен произведена как прямым подсчетом по тексту программы, так и измерительным способом с помощью монитора Sampler.

Таблица 2. Оценка времени выполнения фрагментов программы прямым подсчетом по тексту программы (для компьютера i486)

№ вершины

Фрагмент программы

Время выполнения в тактах

Pascal

assembler

1

tol := 10-6

x := 2

mov dword ptr [bp-4],large 0358637BDh

1

2

mov

1

2

x1 := x;

mov eax,dword ptr [bp+6]

1

54

mov dword ptr [bp-8],eax

1

fx := x*x-2

fld dword ptr [bp+6]

3

fmul dword ptr [bp+6]

11

fsub dword ptr DGROUP:s@

7

fstp dword ptr [si]

7

dfx := 2*x

fld dword ptr [bp+6]

3

fmul dword ptr DGROUP:s@

11

fstp dword ptr [di]

7

fwait

3

3

if (abs(dfx) < tol)

fld dword ptr [bp-16]

3

49

sub sp,8

1

fstp qword ptr [bp-40]

8

fwait

3

call far ptr _fabs

17

add sp,8

1

fcomp dword ptr [bp-4]

4

fstsw word ptr [bp-22]

3

fwait

3

mov ax,word ptr [bp-22]

1

sahf

2

jae short @2@170

3

4

if (dfx >= 0)

fld dword ptr [bp-16]

3

24

fldz

4

fcompp

5

fstsw word ptr [bp-22]

3

fwait

3

mov ax,word ptr [bp-22]

1

sahf

2

ja short @2@142

3

5

dfx := tol

mov eax,dword ptr [bp-4]

1

5

mov dword ptr [bp-16],eax

1

jmp short @2@170

3

6

dfx := -tol

fld dword ptr [bp-4]

3

19

fchs

6

fstp dword ptr [bp-16]

7

fwait

3

7

dx := fx/dfx

fld dword ptr [bp-12]

3

100

fdiv dword ptr [bp-16]

73

fstp dword ptr [bp-20]

7

x := x1 - dx

fld dword ptr [bp-8]

3

fsub dword ptr [bp-20]

7

fstp dword ptr [bp+6]

7

8

abs(dx)<=abs(tol*x)

fld dword ptr [bp-20]

3

109

sub sp,8

1

fstp qword ptr [bp-40]

8

fwait

3

call far ptr _fabs

17

add sp,8

1

fstp tbyte ptr [bp-32]

6

fld dword ptr [bp-4]

3

fmul dword ptr [bp+6]

11

sub sp,8

1

fstp qword ptr [bp-40]

8

fwait

3

call far ptr _fabs

17

add sp,8

1

fld tbyte ptr [bp-32]

6

fcompp

5

fstsw word ptr [bp-22]

3

fwait

3

mov ax,word ptr [bp-22]

1

sahf

2

jbe short @@1

3

jmp @2@58

3

Текст программы с контрольными точками

uses sampler;

const PName : string[10] = 'Newton.pas';

var x_input : real;

alldone : boolean;

procedure newton(var x_input: real);

var fx,dfx,dx,tol,x,x1,x2 : real;

i : longint;

begin { newton }

for i:=1 to 1000 do

begin

Sample(PName,1);

Sample(PName,2);

x:=x_input;

tol:=1.0E-6;

repeat

Sample(PName,3);

x1:=x;

fx:=x*x-2.0;

dfx:=2.0*x;

Sample(PName,4);

if(abs(dfx)<tol)

then begin

Sample(PName,5);

if(dfx>=0.0)

then begin

Sample(PName,6);

dfx:=tol;

Sample(PName,7);

end

else begin

Sample(PName,8);

dfx := -tol;

Sample(PName,9);

end;

Sample(PName,10);

end;

Sample(PName,11);

dx:=fx/dfx;

x:=x1-dx;

{writeln('x=',x1,',fx=',fx,',dfx=',dfx);}

Sample(PName,12);

until abs(dx)<=abs(tol*x);

Sample(PName,13);

end;{for}

x_input:=x;

end; { newton }

begin { main program }

alldone:=false;

repeat

writeln;

write('First guess (999. to exit): '); { first guess }

readln(x_input);

if x_input=999. then alldone:=true

else

begin

newton(x_input);

writeln;

writeln('The solution is ',x_input);

writeln;

end

until alldone

end.

Таблица 3. Результаты измерений при выполнении программы 1000 раз для x=10-7

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

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

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

1 : 1 1 : 2 31.36 1000 0.03

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

1 : 2 1 : 3 51.47 1000 0.05

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

1 : 3 1 : 4 16950.94 26000 0.65

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

1 : 4 1 : 5 135.20 1000 0.14

1 : 4 1 : 11 2961.54 25000 0.12

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

1 : 5 1 : 6 151.97 1000 0.15

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

1 : 6 1 : 7 28.78 1000 0.03

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

1 : 7 1 : 10 82.01 1000 0.08

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

1 : 10 1 : 11 49.55 1000 0.05

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

1 : 11 1 : 12 29273.30 26000 1.13

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

1 : 12 1 : 3 8213.25 25000 0.33

1 : 12 1 : 13 340.54 1000 0.34

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

1 : 13 1 : 1 56.18 999 0.06

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

Измерения проведены с помощью монитора Sampler версии 1999.

Режим измерения времени: счетчик TSC.

Время коррекции: 568 минитиков.

Таблица 4. Измерение времени выполнения фрагментов программы в мкс

(указаны средние значения при выполнении программы 1000 раз)

№ вершины

Входное значение x

2

3

-10-7

10-7

-10-7

10-7

1

0,08

0,06

0,05

0,05

0,07

0,09

2

0,70

0,65

0,64

0,65

0,69

0,66

3

0,11

0,11

0,12

0,12

0,12

0,11

4

-

-

0,19

0,15

0,13

0,12

5

-

-

-

0,03

-

0,04

6

-

-

0,04

-

0,06

-

7

1,05

1,13

1,10

1,13

1,12

1,12

8

0,32

0,32

0,36

0,33

0,37

0,35

Таблица 5. Оценка времени выполнения фрагментов программы

№ вершины

Оценка времени выполнения

прямым подсчетом в тактах

измерением в мкс

1

2

0,07

2

54

0,67

3

49

0,11

4

24

0,16

5

5

0,04

6

19

0,05

7

100

1,10

8

109

0,35

Несоответствия между подсчитанным и измеренным временем выполнения фрагментов программы можно объяснить различием компьютеров, для которых эти оценки производились.

Подсчет для компьютера: i486.

Измерение на компьютере: Celeron 850MHz.

В ОГМ в качестве времени выполнения фрагментов программы использованы оценки, полученные с помощью измерений.

10