> Message: 6
> Date: Wed, 22 Sep 2010 16:08:37 +0200 (CEST)
> From: stefan...@web.de
> Subject: Re: [fpc-pascal] code optimization
> To: fpc-pascal@lists.freepascal.org
> Message-ID:
>       <1487431390.1512221.1285164517310.javamail.fm...@mwmweb065>
> Content-Type: text/plain; charset=UTF-8
> 
> Hi Adrian,
> 
> it is a scientific application that I have, which has about 2000 lines of 
> code. By extracting the most time consuming routine I now have 360 lines of 
> code. With this code I get the following runtime results:
> 
> optimized FPC pascal   *** is  58% SLOWER  ***  than optimized DELPHI 7
> unoptimized FPC pascal *** is 60% SLOWER *** than optimized DELPHI 7
> unoptimized Delphi 7  *** is 62% SLOWER *** than optimized DELPHI 7
> 
> Thus it looks like FPC pascal is doing very bad on optimizing the code. 
> I agree, that I also have seen examples where FPC pascal code is about 10% 
> faster than Delphi code. 
> So why does FPC pascal fail on this code?
> 
> I have included the code below. I compiled it with Delphi 7 , optimization 
> on, range checking off, stack checking off, I/O checking off.
> For FPC pascal I used the compiler options: Â -Mdelphi -O3 -OpPENTIUMM 
> -Cfsse2 -Cr- -Co- -CO- -Ci-
> The FPC compiler version is 2.4.0, I run under Windows XP.
> 
> any suggestions?
> Stefan

My 2 cents: 
looking at the code, i would assume that you can gain by using linked lists 
with pointers instead of arrays and working with the index. This would reduce 
the number of offset calculations. However, it means quite a rewrite. So, do 
you really need more speed?

Even the following primitive replace, which is not yet a conversion to a linked 
list already saved about 10% on Mac OS X:

      while CurrentRectangle <> 0 do
      begin
        i := CurrentRectangle;
        if (UnsortedRectangle[i].Width <= MinValleyWidth) then
          inc (TotalAreaOfFittingRectangles, UnsortedRectangle[i].Area);
        CurrentRectangle := 
UnsortedRectangle[CurrentRectangle].NextUnusedRectangle
      end;

-----

var
  ThisUnsortedRectangle: ^TRectangle;
...
      while CurrentRectangle <> 0 do
      begin
        ThisUnsortedRectangle := @UnsortedRectangle[CurrentRectangle];
        if (ThisUnsortedRectangle^.Width <= MinValleyWidth) then
          inc (TotalAreaOfFittingRectangles, ThisUnsortedRectangle^.Area);
        CurrentRectangle := ThisUnsortedRectangle^.NextUnusedRectangle
      end;

Btw. profiling indicates that this loop takes over 30% of cpu time. Skipping 
the initial assignment (i := CurrentRectangle;) made up for about 5%.

All the best

Michael Schindler_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to