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.
