Eric Hughes <eric.eh9@[EMAIL PROTECTED]
> writes:
> On Mar 29, 7:51 am, kongra <kon...@[EMAIL PROTECTED]
> wrote:
>> Start_T := Ada.Real_Time.Clock;
>> for K in 1 .. 10 loop
>> for I in 1 .. 10_000_000 loop
>> Val := Val + I;
>> end loop;
>> end loop;
>> End_T := Ada.Real_Time.Clock;
>
> I have a question about this piece of the program. Because the middle
> uses only variables 'K', 'I', and 'Val', and the side-effects of
> modifying these variables are entirely local, and because there's no
> inter-dependency of these variables upon either the first or last
> statements, aren't the following reorderings legal for code
> generation? To wit:
>
> Long_Statement ;
> Start_T := Ada.Real_Time.Clock ;
> End_T := Ada.Real_Time.Clock ;
>
> Start_T := Ada.Real_Time.Clock ;
> End_T := Ada.Real_Time.Clock ;
> Long_Statement ;
>
> Irrelevant to the quirks mentioned earlier, isn't it legal operation
> for the interval to come out zero?
Yes.
For example, I can calculate the final value of Val with pencil and
paper, so I guess I could teach an optimizer to do it at compile time.
;-)
>...It seems that for known-correct
> operation for all possible compilers you'd need to manually serialize
> these operations in the order desired.
The only thing that's guaranteed is I/O behavior, so you have to do some
I/O. And you should inspect the generated machine code to see if you're
measuring what you think you're measuring. In other words, this sort of
thing is pretty much outside the language definition. Also, it might be
better to measure using outside tools, like the Unix 'time' command, or
perhaps a stopwatch.
- Bob


|