Time a function: Difference between revisions

From Rosetta Code
Content added Content deleted
m (→‎{{header|Python}}: import sys)
(Added J solution.)
Line 42: Line 42:
Identity(4) takes 0.000001117 seconds.
Identity(4) takes 0.000001117 seconds.
Sum(4) takes: 0.000003632 seconds.
Sum(4) takes: 0.000003632 seconds.

=={{header|J}}==
Time and space requirements are tested using verbs obtained through the Foreign conjunction. <tt>6!:2</tt> returns time required for execution, in floating-point measurement of seconds. <tt>7!:2</tt> returns space required to execute, in bytes. Both receive a sentence for execution.
<br>Execution time and space can both be affected by prior calculations. (E.g. space allocation that occurred an earlier test may make subsequent tests much faster than an initial execution.) The order in which tests occur may therefore affect results. Such things must be taken into account when accuracy of performance measurement is important.
(6!:2,7!:2) 'test sentence goes here'


=={{header|Python}}==
=={{header|Python}}==

Revision as of 06:18, 9 February 2008

Task
Time a function
You are encouraged to solve this task according to the task description, using any language you may know.

What time does it take to execute a `function' with a given `arguments'.

Use a timer with the least granularity available on your system.

What caveats are there?

This task is intended as a subtask for Measure relative performance of sorting algorithms implementations.

Ada

with Ada.Calendar; use Ada.Calendar;
with Ada.Text_Io; use Ada.Text_Io;

procedure Query_Performance is
   type Proc_Access is access procedure(X : in out Integer);
   function Time_It(Action : Proc_Access; Arg : Integer) return Duration is
      Start_Time : Time := Clock;
      Finis_Time : Time;
      Func_Arg : Integer := Arg;
   begin
      Action(Func_Arg);
      Finis_Time := Clock;
      return Finis_Time - Start_Time;
   end Time_It;
   procedure Identity(X : in out Integer) is
   begin
      X := X;
   end Identity;
   procedure Sum (Num : in out Integer) is
   begin
      for I in 1..1000 loop
         Num := Num + I;
      end loop;
   end Sum;
   Id_Access : Proc_Access := Identity'access;
   Sum_Access : Proc_Access := Sum'access;
   
begin
   Put_Line("Identity(4) takes" & Duration'Image(Time_It(Id_Access, 4)) & " seconds.");
   Put_Line("Sum(4) takes:" & Duration'Image(Time_It(Sum_Access, 4)) & " seconds.");
end Query_Performance;

Example

Identity(4) takes 0.000001117 seconds.
Sum(4) takes: 0.000003632 seconds.

J

Time and space requirements are tested using verbs obtained through the Foreign conjunction. 6!:2 returns time required for execution, in floating-point measurement of seconds. 7!:2 returns space required to execute, in bytes. Both receive a sentence for execution.
Execution time and space can both be affected by prior calculations. (E.g. space allocation that occurred an earlier test may make subsequent tests much faster than an initial execution.) The order in which tests occur may therefore affect results. Such things must be taken into account when accuracy of performance measurement is important.

   (6!:2,7!:2) 'test sentence goes here'

Python

Interpreter: Python

Given function and arguments return a time (in microseconds) it takes to make the call.

Note: There is an overhead in executing a function that does nothing.

import sys, timeit
def usec(function, arguments):
    modname, funcname = __name__, function.__name__
    timer = timeit.Timer(stmt='%(funcname)s(*args)' % vars(),
                         setup='from %(modname)s import %(funcname)s; args=%(arguments)r' % vars())
    try:
        t, N = 0, 1
        while t < 0.2:            
            t = min(timer.repeat(repeat=3, number=N))            
            N *= 10
        microseconds = round(10000000 * t / N, 1) # per loop
        return microseconds 
    except:
        timer.print_exc(file=sys.stderr)
        raise
def nothing(): pass
def identity(x): return x

Example

>>> print usec(nothing, [])
1.7
>>> print usec(identity, [1])
2.2
>>> print usec(pow, (2, 100))
3.3
>>> print map(lambda n: str(usec(qsort, (range(n),))), range(10))
['2.7', '2.8', '31.4', '38.1', '58.0', '76.2', '100.5', '130.0', '149.3', '180.0']

where qsort() implemented on Quicksort page. Timings show that the implementation of qsort() has quadratic dependence on sequence length N for already sorted sequences (instead of O(N*log(N)) in average).