
-- PERFORMANCE MEASUREMENT : function GET timing ( INTERNAL FLOAT)

with Text_Io;
use Text_Io;
with Remote_Global;
use Remote_Global; -- control optimization
with Iteration; -- obtain stable measurement
with Piwg_Io; -- output results

procedure G000006 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 := 10; -- inside loop count and check
    Iteration_Count : Integer; -- set and varied by ITERATION package
    Stable : Boolean; -- true when measurement stable
    Scratch_String : String (1 .. 20) := "0.010               ";
    Scratch_Length : Natural;
    Scratch_Value : Float;
    package Flt_Io is new Float_Io (Float);
    use Flt_Io;
--

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;
                Remote;  
                Scratch_Value := Float (Inside_Loop) / 1000.0;
                Put (Scratch_String, Scratch_Value);
            end loop;
        end loop;
        Iteration.Stop_Control (Global, Check_Times);


--
-- Test loop
--
-- establish the time for the GET pocdedure on a FLOAT number

        Iteration.Start_Test;
        for J in 1 .. Iteration_Count loop
            Global := 0;
            for Inside_Loop in 1 .. Check_Times loop
                Global := Global + A_One;
                Remote;
                Scratch_Value := Float (Inside_Loop) / 1000.0;
                Put (Scratch_String, Scratch_Value);
                Get (Scratch_String, Scratch_Value, Scratch_Length);
            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
       ("G000006", "Input/Output", Cpu_Time, Wall_Time, Iteration_Count,
        " TEXT_IO.GET getting a floating point fraction from a local string",
        " Timing measurement on 0.001 to 0.01 range of numbers",
        " compare, approximately, to G000005 for integer vs float");

end G000006;