2016-03-07 79 views
0

我有一个代码,应该给我的过程编译时间,但它只让我0秒!计算错了吗?有没有其他方法?GET_TIME在甲骨文

create or replace PROCEDURE proc_time AS 
    v NUMBER := 1; 
    x NUMBER := 0; 
    counter number := 0; 
    summ NUMBER; 
    ex_start NUMBER; 
    ex_end NUMBER; 
    ex_time NUMBER; 
    BEGIN 
    ex_start := dbms_utility.get_time; 
    while counter <= 19 
    loop 
     counter := counter + 1; 
     summ := x+v;  
     x := v; 
     V := summ; 
     dbms_output.put_line('Fibonacci nr'||counter||': '||summ); 
    END loop; 
    ex_end := DBMS_UTILITY.GET_TIME; 
    ex_time := (ex_end-ex_start)/100; 
    DBMS_OUTPUT.PUT_LINE('Exekveringstid: ' || ex_time || ' sekunder.'); 
END; 
/
+1

编译时间或执行时间? – Recoil

+0

执行时间!我注意到现在当我执行时,我正在写compliation! –

回答

0

如由拉利特上述答案说明。您的代码段运行得太快 来计算时差。尝试增加while循环与 一些更大的数字,在这里你走!

CREATE OR REPLACE PROCEDURE proc_time 
AS 
    v  NUMBER := 1; 
    x  NUMBER := 0; 
    counter NUMBER := 0; 
    summ  NUMBER; 
    ex_start NUMBER; 
    ex_end NUMBER; 
    ex_time NUMBER; 
BEGIN 
    ex_start := dbms_utility.get_time; 
    dbms_output.put_line('start time ==>'||NVL(ex_start,0)); 
    WHILE counter <= 190000 
    LOOP 
    counter := counter + 1; 
    summ := x  +v; 
    x  := v; 
    V  := summ; 
    --  dbms_output.put_line('Fibonacci nr'||counter||': '||summ); 
    END LOOP; 
    ex_end := DBMS_UTILITY.GET_TIME; 
    dbms_output.put_line('End time ==>'||ex_end); 
    ex_time := (ex_end-ex_start); 
    DBMS_OUTPUT.PUT_LINE('Exekveringstid: ' || ex_time || ' sekunder.'); 
END; 

set serveroutput on; 
exec proc_time; 

-------------------------------OUTPUT---------------------------------------- 

start time ==>1761607275 
End time ==>1761607281 
Exekveringstid: 6 sekunder. 
+0

我怀疑它也是简短:-P谢谢拉利特和Avrajit你的帮助:-) –

1
  • 也许,这是执行得太快。您可以尝试将环路数而不是19增加到更大的数目。

  • 此外,它会给你的执行恬 E,而不是编译时间。该过程已经编译并存储在数据库中。输出中的时间在运行时,即执行该过程时。

例如,

SQL> CREATE OR REPLACE PROCEDURE test_time 
    2 AS 
    3 l_start NUMBER; 
    4 l_loops NUMBER := 10000000; 
    5 l_number NUMBER := 0; 
    6 BEGIN 
    7 l_start := DBMS_UTILITY.get_time; 
    8 FOR i IN 1 .. l_loops 
    9 LOOP 
10  l_number := l_number + i; 
11 END LOOP; 
12 DBMS_OUTPUT.put_line('time taken: ' || (DBMS_UTILITY.get_time - l_start) || ' hsecs'); 
13 END test_time; 
14/

Procedure created. 

SQL> set serveroutput on 
SQL> BEGIN 
    2  test_time; 
    3 END; 
    4/
time taken: 101 hsecs 

PL/SQL procedure successfully completed. 

SQL> 
+0

单位'hsecs'似乎是非常*专有*,更好地使用SI符合前缀[Centi-](https://en.wikipedia.org/wiki/Centi-),即'csec' –

0

作为替代使用TIMESTAMP数据类型,这可支持多达纳秒(提供服务器支持它)

DECLARE 
    ex_start TIMESTAMP(9); 
    Duration INTERVAL DAY TO SECOND; 

    v  NUMBER := 1; 
    x  NUMBER := 0; 
    counter NUMBER := 0; 
    summ  NUMBER; 

BEGIN 
    ex_start := LOCALTIMESTAMP; 
    WHILE counter <= 10000 LOOP 
     counter := counter + 1; 
     summ := x  +v; 
     x  := v; 
     V  := summ; 
    END LOOP; 

    Duration := LOCALTIMESTAMP - ex_start; 
    DBMS_OUTPUT.PUT_LINE (EXTRACT(SECOND FROM Duration) /1000||' msec.'); 
END;