Программирование >>  Oracle 

1 ... 426 427 428 [ 429 ] 430 431 432 ... 469


1710 Приложение А

PROCEDURE, FUNCTION)) group by pl.unit owner, pl.unit name;

prompt = prompt =

prompt = = = = = = = = = = = = = = = = = = = =

prompt Количество реально выполненных строк для всех программных единиц select count(pl.line#) as lines executed from plsql profiler lines cross run p1 where (pl.unit type in (PACKAGE BODY, TYPE BODY,

PROCEDURE, FUNCTION))

AND pl.total occur > 0;

prompt = prompt = prompt -

prompt Общее количество строк во всех программных единицах select count(pl.line#) as lines present

from plsql profiler lines cross run p1 where (pl.unit type in (PACKAGE BODY, TYPE BODY,

PROCEDURE , FUNCTION));

spool off

set termout on edit profsum.out set linesize 131

Я постарался поместить отчет в стандартное окно терминала шириной 80 символов. Вы можете изменить формат некоторых столбцов, если не так часто используете программу Telnet.

Рассмотрим результаты, которые получены при тестировании функций, вычисляющих факториал, т.е. результаты работы представленного выше сценария profsum.sql.

Суммарное время

GRAND TOTAL

5.57

Суммарное время выполнения двух тестов составило 5,S7 секунды. Теперь посмотрим, сколько выполнялся каждый тест.

Суммарное время каждого прогона

RONID RUN COMMENT SECS

17 factorial 3.26 recursive

18 factorial 2.31 iterative

Рекурсивная версия уступает по производительности - она выполнялась почти в полтора раза дольше. Теперь посмотрим, сколько выполнялся каждый модуль (пакет или процедура) в тесте и какой процент это составляет от общего времени выполнения.



Пакет DBMS PROFILER

1711

Процент времени, приходящийся на каждый модуль (отдельно для каждого прого-

на):

RUNID RUN COMMENT UNIT OWNER UNIT NAME

SECS PERCEN

17 factorial TKYTE

recursive

17 factorial SYS recursive

FACT RECURSIVE 1.87 57.5 DBMS OUTPUT 1.20 36.9

17 factorial <anonymous> <anonymous> recursive

17 factorial <anonymous> <anonymous> recursive

18 factorial SYS

iterative

18 factorial TKYTE iterative

DBMS OUTPUT FACT ITERATIVE

18 factorial <anonymous> <anonymous> iterative

18 factorial <anonymous> <anonymous> iterative

.08 2.5

.06 1.9

1.24 53.6

.89 38.5

.08 3.4

.06 2.7

8 rows selected.

По этим данным видно, что в рекурсивной реализации 57% времени приходится на выполнение нашей функции, 37% - на выполнение процедуры DBMS OUTPUT, а остальное время выполняются прочие подпрограммы. Во втором тесте результаты существенно отличаются. На выполнение нашего кода пришлось лишь 38% суммарного времени, причем это проценты от существенно меньшего времени! Это убедительно показывает, что вторая реализация эффективней первой. Столбец SECS содержит еще более показательные результаты. Как видите, рекурсивная функция выполнялась 1,87 секунды, а итеративная - 0,89. Если проигнорировать выполнение операторов DBMS OUTPUT, окажется, что итеративная функция работает вдвое быстрее, чем рекурсивная.

Учтите, что результаты в вашей системе могут отличаться. Если не выполнить команду SERVEROUTPUT ON в SQL*Plus, например, вызовы DBMS OUTPUT могут даже не попасть в отчет. Если выполнять тесты на других машинах, значения будут существенно отличаться. Например, при выполнении тестов на машине Sparc Solaris, суммарное время (GRAND TOTAL) составило около 1,0 секунды, а время выполнения каждого раздела кода отличалось. В процентах, тем не менее, конечные результаты практически совпали.

Теперь рассмотрим, сколько времени суммарно в тестах выполнялся каждый модуль. Это покажет, какой фрагмент кода выполнялся дольше всего.



1712 Приложение

Процент времени, приходящийся на каждый модуль, суммарно по всем прогонам:

UNIT OWNER UNIT NAME SECS PERCENTAG

SYS DBMS OUTPUT 2.44 43.82

TKYTE FACT RECURSIVE 1.87 33.61

TKYTE FACT ITERATIVE .89 16.00

<anonymous> <anonymous> .33 5.88

SYS DBMS PROFILER .04 .69

Очевидно, что время выполнения можно уменьшить почти вдвое, убрав один вызов DBMS OUTPUT. Если просто выполнить SET SERVEROUTPUT OFF, отключив выполнение DBMS OUTPUT, и повторно выполнить тесты, окажется, что на эту процедуру приходится менее 3% общего времени выполнения. Сейчас, однако, именно эта процедура выполнялась дольше всего. Что еще интереснее - 33% времени заняло выполнение рекурсивной функции и 16% - итеративной. Итеративная функция работает намного быстрее.

Теперь рассмотрим более детальную информацию.

Строки, для выполнения которых потребовалось более 1% суммарного времени, -> отдельно по каждому прогону:

HSECS

OWNER

UNIT NAME

LINE

TEXT

142.47

25.6

TKYTE

FACT RECURSIVE:

return n*fact recursive(n-l);

68.00

12.2

TKYTE

FACT ITERATIVE

l result := l result * i;

43.29

TKYTE

FACT RECURSIVE

if ( n = 1 )

19.58

DBMS OUTPUT

a3 a0 51 a5 lc 6e 81 b0

19.29

3. 5

TKYTE

FACT ITERATIVE

for i in 2 .. n

17.66

DBMS OUTPUT

a3 a0 51 a5 lc 6e 81 b0

14.76

DBMS OUTPUT

lc 51 81 b0 a3 a0 lc 51

14.49

2. 6

DBMS OUTPUT

lc 51 81 b0 a3 a0 lc 51

13.41

DBMS OUTPUT

:2 a0 a5 b b4 2e d b7 19

13.22

DBMS OUTPUT

:2 a0 a5 b b4 2e d b7 19

10.62

DBMS OUTPUT

6e Ы 2e d :2 a0 7e 51 b4

10.46

DBMS OUTPUT

6e b4 2e d :2 a0 7e 51 b4

8.11

DBMS OUTPUT

1TO CHAR:

8.09

DBMS OUTPUT

8f a0 b0 3d b4 55 6a :3 a0

8.02

DBMS OUTPUT

lTO CHAR:

8.00

DBMS OUTPUT

8f a0 b0 3d b4 55 6a :3 a0

7.52

<ano>

<anonymous>

7.22

<ano>

<anonymous>

6.65

DBMS OUTPUT

a0 b0 3d b4 55 6a :3 a0 7e

6.21

<ano>

<anonymous>

6.13

<ano>

<anonymous>

5.77

DBMS OUTPUT

lORU-10028:: line length

22 rows selected.

Здесь выдается время выполнения (в сот1х долях секунды) и процент от общего времени выполнения. В этих результатах нет ничего удивительного: можно б1ло предположить, что дольше всего будет выполняться строка 8 рекурсивной и строка 7 итеративной функции. Это предположение подтверждается. В этой части кода показываются



1 ... 426 427 428 [ 429 ] 430 431 432 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика