|
Программирование >> Oracle
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% суммарного времени, -> отдельно по каждому прогону:
22 rows selected. Здесь выдается время выполнения (в сот1х долях секунды) и процент от общего времени выполнения. В этих результатах нет ничего удивительного: можно б1ло предположить, что дольше всего будет выполняться строка 8 рекурсивной и строка 7 итеративной функции. Это предположение подтверждается. В этой части кода показываются
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |