Справочник по Ada 2005
D.14 Время выполнения
Этот раздел описывает пакет, определённый языком, для измерения времени выполнения.
Статическая семантика
Существует следующий определяемый языком библиотечный пакет:
with Ada.Task_Identification;
with Ada.Real_Time; use Ada.Real_Time;
package Ada.Execution_Time is
with Ada.Real_Time; use Ada.Real_Time;
package Ada.Execution_Time is
type CPU_Time is private;
CPU_Time_First : constant CPU_Time;
CPU_Time_Last : constant CPU_Time;
CPU_Time_Unit : constant := определяемое реализацией вещественное число;
CPU_Tick : constant Time_Span;
CPU_Time_First : constant CPU_Time;
CPU_Time_Last : constant CPU_Time;
CPU_Time_Unit : constant := определяемое реализацией вещественное число;
CPU_Tick : constant Time_Span;
function Clock
(T : Ada.Task_Identification.Task_Id
:= Ada.Task_Identification.Current_Task)
return CPU_Time;
(T : Ada.Task_Identification.Task_Id
:= Ada.Task_Identification.Current_Task)
return CPU_Time;
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;
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;
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;
function "<=" (Left, Right : CPU_Time) return Boolean;
function ">" (Left, Right : CPU_Time) return Boolean;
function ">=" (Left, Right : CPU_Time) return Boolean;
procedure Split
(T : in CPU_Time; SC : out Seconds_Count; TS : out Time_Span);
(T : in CPU_Time; SC : out Seconds_Count; TS : out Time_Span);
function Time_Of (SC : Seconds_Count;
TS : Time_Span := Time_Span_Zero) return CPU_Time;
TS : Time_Span := Time_Span_Zero) return CPU_Time;
private
... -- не определено языком
end Ada.Execution_Time;
... -- не определено языком
end Ada.Execution_Time;
Время выполнения, или время процессора заданного задания, определяется как время, затрачиваемое системой на выполнение этого задания, включая время выполнения операций в реальном времени или системных сервисов от его имени. Механизм измерения времени выполнения определяется реализацией. Реализация определяет, какое задание, если таковое имеется, несет ответственность за время выполнения, потребляемое обработчиками прерываний и службами выполнения от имени системы.
Тип CPU_Time представляет собой время выполнения задания. Множество значений этого типа взаимно однозначно соответствует определённому реализацией диапазону математических целых чисел.
Значение CPU_Time I представляет собой полуоткрытый интервал времени выполнения, который начинается с I*CPU_Time_Unit и ограничен (I+1)*CPU_Time_Unit, где CPU_Time_Unit — определённое реализацией вещественное число. Для каждого задания значение времени выполнения устанавливается в ноль при создании задания.
CPU_Time_First и CPU_Time_Last — это наименьшее и наибольшее значения типа CPU_Time соответственно.
Динамическая семантика
CPU_Time_Unit — это наименьший отрезок времени выполнения, представимый типом CPU_Time; он выражается в секундах. Такт процессорного таймера — это интервал времени выполнения, в течение которого значение таймера (наблюдаемое при вызове функции Clock) остаётся постоянным. CPU_Tick — это средняя длительность таких интервалов.
Эффекты операторов над CPU_Time и Time_Span соответствуют эффектам операторов, определённых для целочисленных типов.
Функция Clock возвращает текущее время выполнения задания, идентифицируемого T; Tasking_Error генерируется, если это задание завершило работу; Program_Error генерируется, если значение T равно Task_Identification.Null_Task_Id.
Эффекты операций Split и Time_Of определяются следующим образом, рассматривая значения типа CPU_Time, Time_Span и Seconds_Count как математические целые числа. Эффект Split (T, SC, TS) заключается в установке значений SC и TS таким образом, чтобы T*CPU_Time_Unit = SC*1.0 + TS*CPU_Time_Unit, и 0.0 ≤ TS*CPU_Time_Unit < 1.0. Значение, возвращаемое Time_Of(SC,TS), — это значение времени выполнения T, такое что T*CPU_Time_Unit=SC*1.0 + TS*CPU_Time_Unit.
Ошибка выполнения
При вызове Clock, если задание, идентифицируемое T, больше не существует, выполнение программы является ошибочным.
Требования к реализации
Диапазон значений CPU_Time должен быть достаточным для уникального представления диапазона времен выполнения от запуска задания до 50 лет выполнения позже. CPU_Tick не должен превышать 1 миллисекунды.
Требования к документации
Реализация должна документировать значения CPU_Time_First, CPU_Time_Last, CPU_Time_Unit и CPU_Tick.
Реализация должна документировать свойства лежащего в основе механизма измерения времен выполнения, такие как поддерживаемый диапазон значений и любые соответствующие аспекты используемых аппаратных или операционных системных средств.
Метрики
Реализация должна документировать следующие метрики:
- Верхняя граница продолжительности интервала времени выполнения тика таймера. Это значение D, такое что если t1 и t2 — любые времена выполнения заданного задания, такие что t1 < t2 и Clockt1 = Clockt2, то t2 – t1 ≤ D.
- Верхняя граница величины скачка таймера. Скачок таймера — это разница между двумя последовательными различными значениями таймера времени выполнения (наблюдаемого при вызове функции Clock с тем же Task_Id).
- Верхняя граница времени выполнения вызова функции Clock в тактах процессора.
- Верхние границы времени выполнения операторов типа CPU_Time в тактах процессора.
Разрешения для реализации
Реализации, предназначенные для машин со значением слова меньше 32 бит, не обязаны поддерживать полный диапазон и точность типа CPU_Time.
Рекомендации по реализации
По возможности, реализации должны обеспечивать механизмы настройки для изменения значения CPU_Tick.