Notepad:Oracle Timer: Difference between revisions
From Amar
Jump to navigationJump to search
No edit summary |
No edit summary |
||
Line 1: | Line 1: | ||
Oracle Timer | Oracle Timer | ||
< | <source lang='sql'> | ||
/* | /* | ||
Overview: | Overview: | ||
Line 218: | Line 218: | ||
GRANT EXECUTE ON tmr_t TO PUBLIC; | GRANT EXECUTE ON tmr_t TO PUBLIC; | ||
</ | </source> | ||
{{Notepad}} | {{Notepad}} |
Revision as of 00:36, 26 April 2015
Oracle Timer
/*
Overview:
Object type to start and stop a timer allowing you to calculate
elapsed time down to the hundredth of a second.
Author: Steven Feuerstein, steven@stevenfeuerstein.com
Requirements:
Oracle10g to take advantage of CPU timing. If on Oracle8i or 9i,
then remove the line next to this comment:
"comment out this line for Oracle8i/9i"
Usage Example:
Declare
v_Iteration NUMBER;
tmr tmr_t;
Begin
v_Iteration := 1000;
tmr := tmr_t('name or description', v_Iteration);
tmr.go;
... Write your test here
tmr.stop;
End;
*/
DROP TYPE tmr_t FORCE;
CREATE TYPE tmr_t AS OBJECT (
-- SHOULD BE private attributes....
starttime INTEGER
, endtime INTEGER
, startcputime INTEGER
, endcputime INTEGER
-- Public attributes
,repetitions INTEGER
, name VARCHAR2 ( 2000 )
, MEMBER PROCEDURE go -- Cannot name a PL/SQL procedure START
, MEMBER PROCEDURE STOP ( show_timing IN BOOLEAN := TRUE )
, MEMBER PROCEDURE STOP ( text IN VARCHAR2 )
, MEMBER FUNCTION timing
RETURN INTEGER
, MEMBER FUNCTION cputiming
RETURN INTEGER
, MEMBER FUNCTION timing_desc
RETURN VARCHAR2
, MEMBER PROCEDURE RESET ( name IN VARCHAR2 := NULL )
-- Replacement constructor, with different name
,STATIC FUNCTION make ( name IN VARCHAR2, repetitions IN INTEGER := 1 )
RETURN tmr_t
-- New in Oracle9i R2: user-defined constructor!
,CONSTRUCTOR FUNCTION tmr_t (
SELF IN OUT tmr_t
, name IN VARCHAR2
, repetitions IN INTEGER
)
RETURN SELF AS RESULT
);
/
CREATE OR REPLACE TYPE BODY tmr_t
AS
STATIC FUNCTION make ( name IN VARCHAR2, repetitions IN INTEGER := 1 )
RETURN tmr_t
IS
BEGIN
RETURN tmr_t ( NULL, NULL, NULL, NULL, NVL ( repetitions, 1 ), name );
END;
CONSTRUCTOR FUNCTION tmr_t (
SELF IN OUT tmr_t
, name IN VARCHAR2
, repetitions IN INTEGER
)
RETURN SELF AS RESULT
IS
BEGIN
SELF.repetitions := NVL ( repetitions, 1 );
SELF.name := name;
RETURN;
END;
MEMBER PROCEDURE go
IS
BEGIN
IF starttime IS NOT NULL
THEN
DBMS_OUTPUT.put_line ( 'You have already started timer "' || name
|| '"'
);
ELSE
starttime := DBMS_UTILITY.get_time;
/* comment out this line for Oracle8i/9i */
startcputime := DBMS_UTILITY.get_cpu_time;
END IF;
END;
MEMBER PROCEDURE STOP ( show_timing IN BOOLEAN := TRUE )
IS
BEGIN
IF endtime IS NOT NULL
THEN
DBMS_OUTPUT.put_line ( 'You have already stopped timer "' || name
|| '"'
);
ELSE
endtime := DBMS_UTILITY.get_time;
/* comment out this line for Oracle8i/9i */
endcputime := DBMS_UTILITY.get_cpu_time;
IF show_timing
THEN
DBMS_OUTPUT.put_line ( timing_desc );
END IF;
END IF;
END;
MEMBER PROCEDURE STOP ( text IN VARCHAR2 )
IS
BEGIN
NULL;
END;
MEMBER PROCEDURE RESET ( name IN VARCHAR2 := NULL )
IS
BEGIN
starttime := NULL;
endtime := NULL;
IF name IS NOT NULL
THEN
SELF.name := name;
END IF;
END;
MEMBER FUNCTION timing
RETURN INTEGER
IS
BEGIN
IF endtime IS NULL
THEN
DBMS_OUTPUT.put_line ( 'You must stop timer "'
|| name
|| '"'
|| ' before you can get timing information.'
);
END IF;
-- Avoid "epoch time" wrap around (thanks, Solomon Yakobson)
-- RETURN endTime - startTime;
RETURN ( MOD ( endtime - starttime + POWER ( 2, 32 ), POWER ( 2, 32 )));
END;
MEMBER FUNCTION cputiming
RETURN INTEGER
IS
BEGIN
IF endcputime IS NULL
THEN
DBMS_OUTPUT.put_line ( 'You must stop timer "'
|| name
|| '"'
|| ' before you can get timing information.'
);
END IF;
-- Avoid "epoch time" wrap around (thanks, Solomon Yakobson)
-- RETURN endTime - startTime;
RETURN ( MOD ( endcputime - startcputime + POWER ( 2, 32 )
, POWER ( 2, 32 )
)
);
END;
MEMBER FUNCTION timing_desc
RETURN VARCHAR2
IS
retval VARCHAR2 ( 2000 );
BEGIN
IF endtime IS NULL
THEN
DBMS_OUTPUT.put_line ( 'You must stop timer "'
|| name
|| '"'
|| ' before you can get timing information.'
);
END IF;
IF NVL ( repetitions, 1 ) > 1
THEN
retval :=
'Timings in seconds for "'
|| name
|| '":'
|| CHR ( 10 )
|| 'Elapsed = '
|| TO_CHAR ( timing / 100 )
|| ' - per rep '
|| TO_CHAR ( ( timing / 100 ) / repetitions )
|| CHR ( 10 )
|| 'CPU = '
|| TO_CHAR ( cputiming / 100 )
|| ' - per rep '
|| TO_CHAR ( ( cputiming / 100 ) / repetitions );
ELSE
retval :=
'Timings in seconds for "'
|| name
|| '":'
|| CHR ( 10 )
|| 'Elapsed = '
|| TO_CHAR ( timing / 100 )
|| CHR ( 10 )
|| 'CPU = '
|| TO_CHAR ( cputiming / 100 );
END IF;
RETURN retval;
END;
END;
/
GRANT EXECUTE ON tmr_t TO PUBLIC;
← Back to Notepad
<insert>googlesearchwiki</insert> | <insert>paypal</insert> | <insert>analytics</insert> |