TEAM-ADA Archives

Team Ada: Ada Programming Language Advocacy

TEAM-ADA@LISTSERV.ACM.ORG

Options: Use Classic View

Use Monospaced Font
Show HTML Part by Default
Condense Mail Headers

Topic: [<< First] [< Prev] [Next >] [Last >>]

Print Reply
Sender: "Team Ada: Ada Advocacy Issues (83 & 95)" <[log in to unmask]>
X-To: Jesse Farmer <[log in to unmask]>, "David C. Hoos, Sr." <[log in to unmask]>
Date: Mon, 6 Nov 2000 10:14:13 -0800
Reply-To: Mark Lundquist <[log in to unmask]>
From: Mark Lundquist <[log in to unmask]>
Content-Transfer-Encoding: 7bit
In-Reply-To: <053601c04719$4e5d3660$312fe3d8@dhoossr>
Content-Type: text/plain; charset="iso-8859-1"
MIME-Version: 1.0
Parts/Attachments: text/plain (110 lines)
David's modified version conceals an important difference, beyond just the
style touchups and "letting the compiler compute the number of seconds per
tick".  You might wonder: why did he write the body of the loop as:

       delay until Next_Time;
       Next_Time := Next_Time + Seconds_Per_Tick;

instead of just saying:

        delay Seconds_Per_Tick;

???

To make a long story short... there's a clock ("time base") associated with
type Ada.Real_Time.Time.  There is no requirement that the clock used for
relative delays (e.g. "delay Seconds_Per_Tick") be the same as any other
clock, in particular the clock used for Ada.Real_Time.Time.  The clock used
for relative delays is implementation-defined, and is often the same clock
as used by package Calendar.  The intent is that Ada.Real_Time can provide a
more accurate clock if the Calendar clock is crappy.

In your (Jesse's) original version, you were using "whatever clock" by
writing a relative delay statement.  This is probably a crappy clock, and
you were timing that clock using the better clock of Ada.Real_Time.

Another possible improvement to your program would be to define

        Ticks_Per_Minute : constant := Beats_Per_Minute * Ticks_Per_Beat
                -- Ticks_Per_Beat is "pulses-per-quarternote" (PPQ)

Mark Lundquist
Rational Software



> -----Original Message-----
> From: Team Ada: Ada Advocacy Issues (83 & 95)
> [mailto:[log in to unmask]]On Behalf Of David C. Hoos, Sr.
> Sent: Sunday, November 05, 2000 3:13 AM
> To: [log in to unmask]
> Subject: Re: Timing for MIDI: an interesting project
>
>
> Here is a suggested approach, along with some suggestions
> for improving program readability, as well as letting the
> compiler compute the number of seconds per tick.
>
> Note also, that I suggest not using the clause
> "use Ada.Real_Time;" -- instead using the clause
> "use type Ada.Real_Time.Time;" to gain visibility of the
> needed operation(s) on taht type.
>
> Finally, the package Standard rarely, (if ever) needs to
> be explicitly specified as a prefix.
>
> with Ada.Real_Time;
> with Ada.Text_Io;
>
> procedure TestTime is
>
>    -- ----------------------------------------------------------
>    --  GET THE STARTING TIME, LOOP, GET THE END TIME, SUBTRACT
>    -- ----------------------------------------------------------
>
>    Time_Start         : Ada.Real_Time.Time;
>    Time_End           : Ada.Real_Time.Time;
>    Time_Difference    : Ada.Real_Time.Time_Span;
>    Time_Duration      : Duration;
>    Next_Time          : Ada.Real_Time.Time;
>    -- Program constants should be defined with names meaningful to
>    -- The problem domain
>    Ticks_Per_Minute   : constant := 17_400;
>    Seconds_Per_Minute : constant := 60.0;
>    -- Constants that are derived should be generated as compile-time
>    -- computations, in terms of the values from which they're derived.
>    Seconds_Per_Tick   : constant Ada.Real_Time.Time_Span :=
>      Ada.Real_Time.To_Time_Span (Seconds_Per_Minute / Ticks_Per_Minute);
>    use type Ada.Real_Time.Time;
> begin
>
>    Time_Start := Ada.Real_Time.Clock;
>    Next_Time  := Time_Start + Seconds_Per_Tick;
>    for I in 1 .. Ticks_per_minute loop
>       delay until Next_Time;
>       Next_Time := Next_Time + Seconds_Per_Tick;
>    end loop;
>    Time_End := Ada.Real_Time.Clock;
>    Time_Difference := Time_End - Time_Start;
>
>    Time_Duration := Ada.Real_Time.To_Duration(Time_Difference);
>
>    Ada.Text_Io.Put ("Time Difference: ");
>    Ada.Text_Io.Put_Line (Duration'Image (Time_Duration));
>
> end TestTime;
>
> Ten iterations of the program produced:
>
> Time Difference:  60.007150628
> Time Difference:  60.003654095
> Time Difference:  60.000104762
> Time Difference:  60.005300113
> Time Difference:  60.009341408
> Time Difference:  60.004193828
> Time Difference:  60.007467428
> Time Difference:  60.052500792
> Time Difference:  60.002551161
> Time Difference:  60.000667962
>

ATOM RSS1 RSS2