在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。忽略呼叫,返回值的開銷,以上總...