PL/SQL によるプログラム処理時間計測 ストップウォッチ
プログラムの処理速度を計測するためのパッケージ。
計測時間の最小単位を 1/100 秒 単位の整数で戻す。1/100 単位の秒数を経過時間の形式(HH24:MI:SS.FF2 形式)で表示できるようにフォーマットする。
(DBMS_UTILITY.GET_TIME を使用することで Oracle8i でも動くように作ったつもりですが動作確認まではしていません)
| プロシージャ・ファンクション名 | 機能 |
| START_TIME | ストップウォッチのスタート |
| SPLIT_TIME | 経過秒数(1/100秒単位)を戻す&計測の継続 |
| STOP_TIME | 所要秒数を戻す&ストップウォッチのクリア |
| TO_TIME | 1/100 秒単位の数値を時分秒の文字列に変換 |
表示精度の改良
最小の精度をミリ秒以下にしたい場合 SYSTIMESTAMP 関数
をする。
最大の精度を日にち以上にしたい場合 EXTRACT 関数 で日にちを分けて処理すると 動作対象が Oracle 9i 以上になってしまうが TO_CHAR で記述するよりスマートに書ける。
使用例
SQL> column time format a25
SQL> call STOPWATCH.START_TIME();
SQL> select count(*) from all_catalog;
..(結果省略)
SQL> select STOPWATCH.TO_TIME(STOPWATCH.SPLIT_TIME,'経過時間:') time from dual;
TIME
-------------------------
経過時間:00:00:00.08
SQL> set serveroutput on
SQL> call dbms_lock.sleep(60.123);
SQL> call dbms_output.put_line(STOPWATCH.TO_TIME(STOPWATCH.STOP_TIME,'合計時間:'));
合計時間:00:01:00.20
時間計測パッケージ・パッケージ本体 ソースコード
パッケージ定義部
CREATE OR REPLACE PACKAGE RIVUS.STOPWATCH
IS
FUNCTION TO_TIME(P_HSEC IN NUMBER, P_CAPTION IN VARCHAR2 := '')
RETURN VARCHAR2;
--
PROCEDURE START_TIME;
--
FUNCTION SPLIT_TIME
RETURN NUMBER;
--
FUNCTION STOP_TIME
RETURN NUMBER;
END;
/
パッケージ本体
CREATE OR REPLACE PACKAGE BODY RIVUS.STOPWATCH
IS
gStartTimeMemory NUMBER;
FUNCTION TO_TIME(P_HSEC IN NUMBER, P_CAPTION IN VARCHAR2 := '')
RETURN VARCHAR2
IS
vMesg VARCHAR2(2000);
vDatetime DATE;
BEGIN
IF (P_HSEC IS NULL) THEN
vMesg := 'START されていません';
ELSE
vDatetime := TO_DATE('2000', 'YYYY') + P_HSEC / 24 / 60 / 60 / 100;
vMesg := P_CAPTION || TO_CHAR(vDatetime, 'HH24:MI:SS.');
vMesg := vMesg || TO_CHAR(MOD(P_HSEC, 100), 'FM00');
END IF;
RETURN vMesg;
END;
--
PROCEDURE START_TIME
IS BEGIN
gStartTimeMemory := DBMS_UTILITY.GET_TIME;
END;
--
FUNCTION SPLIT_TIME
RETURN NUMBER IS
BEGIN
RETURN DBMS_UTILITY.GET_TIME - gStartTimeMemory;
END;
FUNCTION STOP_TIME
RETURN NUMBER IS
vSec NUMBER;
BEGIN
vSec := DBMS_UTILITY.GET_TIME - gStartTimeMemory;
gStartTimeMemory := NULL;
RETURN vSec;
END;
END;
/
関連事項