Hello.

I have written the following program:

program a;
{$mode objfpc}
uses
  SysUtils;
var
  i: integer;
  vd: double;
  t: TDateTime;
  max: int64;// = 100000000;
begin
  t := Now;
  max := 100000000;
  for i := 0 to max do
    vd := i / max;
  Writeln('Time: ', DateTimeToTimeStamp(Now - t).Time, ' ms');
end.

I'm running it on Windows XP i386, compiled with FPC 2.5.1 17430.

# fpc -O a.pas
...
# a.exe
Time: 1462 ms

# fpc -O3 a.pas
...
# a.exe
Time: 3325 ms

It is slower with optimizations.

The for loop with -O looks like this:

.Lj9:
        incl    U_P$A_I
        fildl   U_P$A_I
        fildq   U_P$A_MAX
        fdivrp  %st,%st(1)
        fstpl   U_P$A_VD
        cmpl    U_P$A_I,%eax
        jg      .Lj9

With -O3 like this:

.Lj9:
        incl    %ecx
        movl    %ecx,-4(%ebp)
        fildl   -4(%ebp)
        movl    %edx,-16(%ebp)
        movl    %ebx,-12(%ebp)
        fildq   -16(%ebp)
        fdivrp  %st,%st(1)
        fstpl   U_P$A_VD
        cmpl    %ecx,%eax
        jg      .Lj9

It seems storing variables i and max in registers caused the code to
be slower, because they have to be written to memory anyway.

Is it something that can be rectified in the optimizer, or is it one
of those things that you just have to be aware of?

I have only found that disabling optimizations {$OPTIMIZATION OFF} ...
{$OPTIMIZATION DEFAULT} helps, but you have to do it for the entire
function.

--
cobines
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to