通過pl sql計算程式的執行時間

2022-01-31 06:16:15 字數 3006 閱讀 9930

在sqlplus中執行sql語句或者pl/sql的時候如果需要統計執行的時間,只需要開啟set timing on選項即可。

sql> set timing on

sql>

sql> select count(*)from cat;

count(*)

----------

408

elapsed: 00:00:00.15

如果在執行pl/sql的時候如果需要計算程式執行的時間。使用set timing on就顯得力不從心了。這個時候可以考慮使用dbms_utility.get_time來得到乙個時間戳,然後在程式執行之後再得到乙個時間戳,兩者想減就是程式的執行時間。

set serveroutput on

declare

l_start_time pls_integer;

begin

l_start_time := dbms_utility.get_time();

dbms_output.put_line('this is a test');

dbms_lock.sleep(2);  --這裡我們嘗試使pl/sql塊停滯2秒鐘

dbms_output.put_line('elapsed time :'||(dbms_utility.get_time-l_start_time)/100);

end;

/程式執行的結果如下。

this is a test

elapsed time :2.01

pl/sql procedure successfully completed.

但是如果這樣計算,可能會出現負數的情況。在pl/sql程式設計這本書中,作者給出的解釋是,dbms_utility_get_time得到的數字式從某乙個時間點以來所經過的總的毫秒數。而這個數字很大,很可能越界,越界的時候就會從0開始重新開始計數。如果這樣計算的話,很可能計算出來的結果就是乙個負數了。

我們可以使用如下的pl/sql來做乙個改進。

set serveroutput on

declare

c_time_gap number:=power(2,32);

l_start_time pls_integer;

begin

l_start_time := dbms_utility.get_time();

dbms_output.put_line('this is a test');

dbms_lock.sleep(2);

dbms_output.put_line('elapsed time :'||mod(dbms_utility.get_time-l_start_time+c_time_gap,c_time_gap)/100);

end;

/執行結果如下:

this is a test

elapsed time :2

pl/sql procedure successfully completed.

如果我們在程式中嵌入過多的**去維護start_time,end_time必然會造成程式的依賴性,如果能夠把計算時間的功能獨立出來就好了。這樣程式的執行不必完全依賴於時間計算,可以靈活的新增和刪除。

這種實現在spring的aop是根據動態**來實現的,在pl/sql中我們可以使用package來實現。

我們的期望結果就是

begin

pro_timing.start_timer;  --程式計算起始時間

dbms_output.put_line('this is a test');  --程式業務邏輯

dbms_lock.sleep(2);  --程式業務邏輯

pro_timing.show_elapsed('test program');  --程式計算終止時間

end;

/我們可以使用如下的package來實現。

create or replace package pro_timing

authid current_user

isprocedure start_timer;

procedure show_elapsed(program_name in varchar2);

end;

/ create or replace package body pro_timing

isc_time_gap number:=power(2,32);

l_start_time pls_integer;

procedure start_timer

isbegin

l_start_time := dbms_utility.get_time();

end;

procedure show_elapsed(program_name in varchar2)

asl_end_time varchar2(100);

begin

l_end_time:=mod(dbms_utility.get_time-l_start_time+c_time_gap,c_time_gap)/100;

dbms_output.put_line(program_name||' has elapsed time '||l_end_time||' s.');

end;

end;

/我們來嘗試執行如下的pl/sql塊。

begin

pro_timing.start_timer;

dbms_output.put_line('this is a test');

dbms_lock.sleep(2);

pro_timing.show_elapsed('test program');

end;

/執行結果如下:

this is a test

test program has elapsed time 2 s.

pl/sql procedure successfully completed.

這樣就基本達到了我們的目標。我們可以在程式中靈活的配置這項功能,對於提公升程式的效能來說也是功不可沒。

php程式執行時間 php計算程式的執行時間

首先我們分析一下原理,要想得到程式執行時間,那麼可以在程式最開始執行的時候定義乙個變數記下當前時間,然後等我們程式執行完之後再記錄一下當前的時間,兩者相差就是該程式執行花費的時間了。這裡介紹一下 microtime 這個函式,microtime 用的不多,但是不能不知道這個函式,它是返回當前 uni...

計算程式執行時間

在長時間計算程式執行時間時,可以使用clock函式。clock比較通用,精度並不是特別的高,大約是10ms。但是對於長時間的計算的話,還是可以使用的。以下是一段示例程式,將幫助你理解 include stdio.h include memory.h include time.h define siz...

程式執行時間計算

int sum int n 分析 宣告不計時間,第一句,第四句各占用乙個時間單位。第三句每執行一次占用四個時間單位,兩次乘法,一次加法,一次賦值。而執行n次共占用4n個時間單位。第二行初始化i,乙個時間單位 測試i n,n 1個時間單位 i n個時間單位 總共2n 2。忽略呼叫,返回值的開銷,以上總...