-
Notifications
You must be signed in to change notification settings - Fork 14
Util_Measures
Performance measurements is often made using profiling tools such as GNU gprof or others. This profiling is however not always appropriate for production or release delivery. The mechanism presented here is a lightweight performance measurement that can be used in production systems.
The Ada package Util.Measures
defines the types and operations to make
performance measurements. It is designed to be used for production and multi-threaded
environments.
Measures are collected in a Measure_Set
. Each measure has a name, a counter and
a sum of time spent for all the measure. The measure set should be declared as some
global variable. The implementation is thread safe meaning that a measure set can
be used by several threads at the same time. It can also be associated with
a per-thread data (or task attribute).
To declare the measure set, use:
with Util.Measures;
...
Perf : Util.Measures.Measure_Set;
A measure is made by creating a variable of type Stamp
. The declaration of
this variable marks the begining of the measure. The measure ends at the
next call to the Report
procedure.
with Util.Measures;
...
declare
Start : Util.Measures.Stamp;
begin
...
Util.Measures.Report (Perf, Start, "Measure for a block");
end;
When the Report
procedure is called, the time that elapsed between the creation of
the Start
variable and the procedure call is computed. This time is
then associated with the measure title and the associated counter is incremented.
The precision of the measured time depends on the system. On GNU/Linux, it uses
gettimeofday
.
If the block code is executed several times, the measure set will report the number of times it was executed.
After measures are collected, the results can be saved in a file or in an output stream. When saving the measures, the measure set is cleared.
Util.Measures.Write (Perf, "Title of measures",
Ada.Text_IO.Standard_Output);
The overhead introduced by the measurement is quite small as it does not exceeds 1.5 us on a 2.6 Ghz Core Quad.
Defining a lot of measurements for a production system is in general not very useful. Measurements should be relatively high level measurements. For example:
- Loading or saving a file
- Rendering a page in a web application
- Executing a database query
Generated by Dynamo from util-measures.ads