Test Harness for Measuring CPU and Consisent Gets of PL/SQL or SQL

Update NumRuns to number of executions you would like to measure. Update 'Start Timed Code' section to include the code you want to measure.
connect / as sysdba
grant select on v_$session to scott;
grant select on v_$sesstat to scott;
grant select on v_$statname  to scott;


connect scott/tiger

set serveroutput on
SPOOL timing.txt

SET SERVEROUTPUT ON
DECLARE
  NumRuns     NUMBER := 5;

  Time_Start  DATE;
  Time_Current NUMBER := 0;
  Time_Total   NUMBER := 0;

  CPU_Start   NUMBER;
  CPU_Current NUMBER := 0;
  CPU_Total   NUMBER := 0;
  
  CG_Start    NUMBER;
  CG_Current  NUMBER := 0;
  CG_Total    NUMBER := 0;
  
  
  FUNCTION GetStat2 (p_statname IN VARCHAR2) 
  RETURN NUMBER 
  IS
    retVal NUMBER;
  BEGIN
     retVal := 0;
     
      SELECT VALUE
        INTO retVal
        FROM v$session ss, v$sesstat se, v$statname sn
       WHERE se.statistic# = sn.statistic#
         AND UPPER(TRIM(NAME)) = UPPER(TRIM(p_statname))
         AND se.SID = ss.SID
        AND ss.SID = USERENV('SID');
     
     RETURN retVal;
     EXCEPTION
       WHEN NO_DATA_FOUND THEN
         NULL;
       WHEN OTHERS THEN
         -- Consider logging the error and then re-raise
         RAISE;
  END GetStat2;
  
BEGIN

  dbms_output.put_line('Starting Compressed');
  dbms_output.put_line('Run#,Elapsed Time (secs),CPU Time (secs),Consistent Gets');

  FOR cnt IN 1..NumRuns
  LOOP


    DBMS_APPLICATION_INFO.SET_MODULE( 
        module_name => 'Timing', 
        action_name => 'Loop '||cnt||' of '||NumRuns);


    Time_Start := SYSDATE;
    CPU_Start  := getstat2('CPU used by this session');
    CG_Start   := getstat2('consistent gets');

    -- Start Timed Code
    UPDATE EMP SET SAL=SAL*1.10;
    COMMIT;
    -- End Timed Code

    Time_Current := (SYSDATE - Time_Start)*86400;
    CPU_Current  := (getstat2('CPU used by this session') - CPU_Start)/100;-- Centiseconds
    CG_Current   := getstat2('consistent gets') - CG_Start;

    Time_Total   := Time_Total + Time_Current;
    CPU_Total    := CPU_Total + CPU_Current; 
    CG_Total     := CG_Total + CG_Current;
     
    DBMS_OUTPUT.PUT_LINE(cnt||','||ROUND(Time_Current,2)
        ||','||CPU_Current||','
        ||CG_Current);
  END LOOP;

  DBMS_OUTPUT.PUT_LINE('Avg,'||ROUND(Time_Total/NumRuns,2)||','
      ||ROUND(CPU_Total/NumRuns,2)||','
      ||ROUND(CG_Total/NumRuns,2));

END;
/