
-- PERFORMANCE MEASUREMENT : Measure the time to perform a change of
--                           representation, if zero, probably not
--                           implemented

with Remote_Global;
use Remote_Global;  -- control optimization
with Iteration;  -- obtain stable measurement

with Piwg_Io;  -- output results


procedure H000009 is  -- main procedure to execute
    Cpu_Time : Duration;  -- CPU time for one feature execution
    Wall_Time : Duration;  -- WALL time for one feature execution
    Check_Times : constant := 100;  -- inside loop count and check
    Iteration_Count : Integer;  -- set and varied by ITERATION package
    Stable : Boolean;  -- true when measurement stable

--
-- define record, then define representation clause
--
    type My_Rec is
        record
            A1 : Integer range -3 .. 3;
            A2 : Boolean;  
            A3 : Integer range 0 .. 15;
            A4 : Integer range 10 .. 100;
            A5 : Boolean;  --5
        end record;

    type My_Packed_Rec is new My_Rec;

    for My_Packed_Rec use
        record
            A1 at 0 range 0 .. 2;
            A2 at 0 range 3 .. 3;
            A3 at 0 range 4 .. 7;
            A4 at 0 range 8 .. 15;
            A5 at 0 range 16 .. 16;
        end record;

    A_Rec : My_Rec := (1, True, 7, 11, False); -- initialize
    B_Rec : My_Packed_Rec;

begin

    Iteration.Start_Control;  -- dummy to bring in pages on some machines

    delay 0.5;  -- wait for stable enviornment on some machines

    Iteration.Initialize (Iteration_Count);

    loop  -- until stable measurement, ITERATION_COUNT increases each time

--
-- Control loop
--
        Iteration.Start_Control;
        for J in 1 .. Iteration_Count loop
            Global := 0;
            for Inside_Loop in 1 .. Check_Times loop
                Global := Global + A_One;  -- prevent optimization
                Remote;
            end loop;
        end loop;
        Iteration.Stop_Control (Global, Check_Times);

--
-- Test loop
--
        Iteration.Start_Test;
        for J in 1 .. Iteration_Count loop
            Global := 0;
            for Inside_Loop in 1 .. Check_Times loop
                Global := Global + A_One;  -- prevent optimization
                Remote;

                B_Rec := My_Packed_Rec (A_Rec);
                B_Rec.A1 := -2;
                A_Rec := My_Rec (B_Rec);
                A_Rec.A2 := False;

            end loop;
        end loop;

        Iteration.Stop_Test (Global, Check_Times);

        Iteration.Test_Stable (Iteration_Count, Stable);

        exit when Stable;

    end loop;

--
    Iteration.Feature_Times (Cpu_Time, Wall_Time);

--
-- Printout
--
    Piwg_Io.Piwg_Output
       ("H000009", "Chapter 13", Cpu_Time, Wall_Time, Iteration_Count,
        " The time to perform a change of representation",
        " If the result is near zero, feature probably not implemented", " ");

end H000009;