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