D.14 Execution Time 
1/2
{
AI95-00307-01} 
This clause describes a language-defined package 
to measure execution time.  
Static Semantics
2/2
{
AI95-00307-01} 
The following language-defined library package 
exists:  
3/2
with Ada.Task_Identification;
with Ada.Real_Time; use Ada.Real_Time;
package Ada.Execution_Time is 
4/2
   type CPU_Time is private;
   CPU_Time_First : constant CPU_Time;
   CPU_Time_Last  : constant CPU_Time;
   CPU_Time_Unit  : constant := implementation-defined-real-number;
   CPU_Tick : constant Time_Span; 
5/2
   function Clock
     (T : Ada.Task_Identification.Task_Id
          := Ada.Task_Identification.Current_Task)
     return CPU_Time; 
6/2
   function "+"  (Left : CPU_Time; Right : Time_Span) return CPU_Time;
   function "+"  (Left : Time_Span; Right : CPU_Time) return CPU_Time;
   function "-"  (Left : CPU_Time; Right : Time_Span) return CPU_Time;
   function "-"  (Left : CPU_Time; Right : CPU_Time)  return Time_Span;
7/2
   function "<"  (Left, Right : CPU_Time) return Boolean;
   function "<=" (Left, Right : CPU_Time) return Boolean;
   function ">"  (Left, Right : CPU_Time) return Boolean;
   function ">=" (Left, Right : CPU_Time) return Boolean;
8/2
   procedure Split
     (T : in CPU_Time; SC : out Seconds_Count; TS : out Time_Span); 
9/2
   function Time_Of (SC : Seconds_Count;
                     TS : Time_Span := Time_Span_Zero) return CPU_Time; 
10/2
private
   ... -- not specified by the language
end Ada.Execution_Time;
11/2
 {
AI95-00307-01} 
{execution time 
(of a task)} {CPU 
time (of a task)} The execution time 
or CPU time of a given task is defined as the time spent by the system 
executing that task, including the time spent executing run-time or system 
services on its behalf. The mechanism used to measure execution time 
is implementation defined. It is implementation defined which task, if 
any, is charged the execution time that is consumed by interrupt handlers 
and run-time services on behalf of the system.  
11.a/2
Discussion: The 
implementation-defined properties above and of the values declared in 
the package are repeated in Documentation Requirements, so we don't mark 
them as implementation-defined. 
12/2
 {
AI95-00307-01} 
The type CPU_Time represents the execution time 
of a task. The set of values of this type corresponds one-to-one with 
an implementation-defined range of mathematical integers. 
13/2
 {
AI95-00307-01} 
The CPU_Time value I represents the half-open execution-time 
interval that starts with I*CPU_Time_Unit and is limited by (I+1)*CPU_Time_Unit, 
where CPU_Time_Unit is an implementation-defined real number. For each 
task, the execution time value is set to zero at the creation of the 
task. 
13.a/2
Ramification: Since 
it is implementation-defined which task is charged execution time for 
system services, the execution time value may become non-zero even before 
the start of the activation of the task. 
14/2
 {
AI95-00307-01} 
CPU_Time_First and CPU_Time_Last are the smallest 
and largest values of the CPU_Time type, respectively.  
Dynamic Semantics
15/2
 {
AI95-00307-01} 
{CPU clock tick} 
CPU_Time_Unit is the smallest amount of execution 
time representable by the CPU_Time type; it is expressed in seconds. 
A CPU clock tick is an execution time interval during which the 
clock value (as observed by calling the Clock function) remains constant. 
CPU_Tick is the average length of such intervals. 
16/2
 {
AI95-00307-01} 
The effects of the operators on CPU_Time and Time_Span 
are as for the operators defined for integer types. 
17/2
 {
AI95-00307-01} 
The function Clock returns the current execution 
time of the task identified by T; Tasking_Error is raised if that task 
has terminated; Program_Error is raised if the value of T is Task_Identification.Null_Task_Id. 
18/2
 {
AI95-00307-01} 
The effects of the Split and Time_Of operations 
are defined as follows, treating values of type CPU_Time, Time_Span, 
and Seconds_Count as mathematical integers. The effect of Split (T, SC, 
TS) is to set SC and TS to values such that T*CPU_Time_Unit = SC*1.0 
+ TS*CPU_Time_Unit, and 0.0 <= TS*CPU_Time_Unit < 1.0. The value 
returned by Time_Of(SC,TS) is the execution-time value T such that T*CPU_Time_Unit=SC*1.0 
+ TS*CPU_Time_Unit. 
Erroneous Execution
19/2
 {
AI95-00307-01} 
{erroneous execution 
(cause) [partial]} For a call of Clock, 
if the task identified by T no longer exists, the execution of the program 
is erroneous.  
Implementation Requirements
20/2
 {
AI95-00307-01} 
The range of CPU_Time values shall be sufficient 
to uniquely represent the range of execution times from the task start-up 
to 50 years of execution time later. CPU_Tick shall be no greater than 
1 millisecond.  
Documentation Requirements
21/2
 {
AI95-00307-01} 
The implementation shall document the values of 
CPU_Time_First, CPU_Time_Last, CPU_Time_Unit, and CPU_Tick.  
21.a/2
Documentation Requirement: 
The values of CPU_Time_First, CPU_Time_Last, 
CPU_Time_Unit, and CPU_Tick of package Execution_Time.
22/2
 {
AI95-00307-01} 
The implementation shall document the properties 
of the underlying mechanism used to measure execution times, such as 
the range of values supported and any relevant aspects of the underlying 
hardware or operating system facilities used.  
22.a/2
Documentation Requirement: 
The properties of the mechanism used 
to implement package Execution_Time.
Metrics
23/2
 {
AI95-00307-01} 
The implementation shall document the following 
metrics: 
24/2
- An upper bound 
on the execution-time duration of a clock tick. This is a value D such 
that if t1 and t2 are any execution times of a given task such that t1 
< t2 and Clockt1 
= Clockt2 
then t2 – t1 <= D.
 
25/2
- An upper bound 
on the size of a clock jump. A clock jump is the difference between two 
successive distinct values of an execution-time clock (as observed by 
calling the Clock function with the same Task_Id).
 
26/2
- An upper bound 
on the execution time of a call to the Clock function, in processor clock 
cycles.
 
27/2
- Upper bounds 
on the execution times of the operators of the type CPU_Time, in processor 
clock cycles. 
 
27.a/2
Documentation Requirement: 
The metrics for execution time.
Implementation Permissions
28/2
 {
AI95-00307-01} 
Implementations targeted to machines with word 
size smaller than 32 bits need not support the full range and granularity 
of the CPU_Time type. 
Implementation Advice
29/2
 {
AI95-00307-01} 
When appropriate, implementations should provide 
configuration mechanisms to change the value of CPU_Tick.  
29.a/2
Implementation Advice: 
When appropriate, implementations should 
provide configuration mechanisms to change the value of Execution_Time.CPU_Tick.
Extensions to Ada 95
29.b/2
{
AI95-00307-01} 
{extensions to Ada 95} The 
package Execution_Time is new.