[fpc-devel] FPC/Lazarus Rebuild performance

Adem listmember at letterboxes.org
Fri Sep 10 17:43:59 CEST 2010

Sometime ago, there was a brief mention of multi-threading FPC would be 
counter productive because compilation process was mostly disk IO bound 
--this is what I understood anyway.

I wanted to check to see if disk IO was really limiting FPC/Lazarus 
compile performance.

The only quick way I could devise to check this was to use two different 
disks which are significantly different from one another in terms of 

And, to help with timing, I modified the mnuToolBuildLazarusClicked() 
event (in \lazarus\ide\main.pp). [See below for code.]

Here is test setup:

OS: Win7, x64, 8 GB RAM.
Disk1: SSD, OCZ Vertex, NTFS
Disk2: RAMDisk, Dataram, NTFS [ 
http://memory.dataram.com/products-and-services/software/ramdisk ]

To show that these disks perform significantly differently from one 
another, I used 'ATTO Disk Benchmark' (default settings) and took the 
max values for each disk.

SSD: Read:   200 MB/s Write:   198 MB/s
RAMDisk: Read: 2,227 MB/s Write: 1,545 MB/s

IOW, RAMDisk is between 8 and 11 times faster than the SSD --significant 
enough for my purposes.

I used this version of Lazarus: lazarus-

Identical copies of (default setup of) Lazarus on both disks.
Nothing, other than the relevant paths altered by me.


Rebuild Lazarus 10 times on each disk. Here are the values:


01: 105,498 ms
02: 103,678 ms
03: 103,345 ms
04: 101,522 ms
05: 104,720 ms
06: 101,874 ms
07: 100,136 ms
08: 100,492 ms
09: 104,850 ms
10: 104,488 ms


01: 101,150 ms
02: 111,198 ms
03: 109,066 ms
04: 103,516 ms
05: 105,875 ms
06: 103,133 ms
07: 104,036 ms
08: 108,763 ms
09: 104,306 ms
10: 103,583 ms

Here are the average values:

     SSD: 103,060 ms (1 min 43 sec)
RAMDisk: 105,463 ms (1 min 46 sec)

This doesn't make sense. FPC/Lazarus compiles on the faster medium 
longer (albeit only 3 sec.).

But, more than that, I can't see how FPC/Lazarus would be disk IO bound, 
if it takes practically the same time on a medium that is 8-11 times 
faster than the other one.

While doing the builds, I kept an eye on the other parameters too. This 
is an 8-core machine, and never during this test did any core hit 
anything beyond %20. Same with paging.. It practically stayed the same.

If it isn't disk IO, if it isn't CPU load; then what is it?

RAM IO bound?

Could it be?

here is modified code:

procedure TMainIDE.mnuToolBuildLazarusClicked(Sender: TObject);
     StartTime1: TDateTime;
     EndTime1: TDateTime;
     Path1: String;
     Times1: TStringList;
   DoTime1: Boolean;
   MilliSecs1: Int64;
     if MiscellaneousOptions.BuildLazOpts.ConfirmBuild then
       if MessageDlg(lisConfirmLazarusRebuild, mtConfirmation, mbYesNo, 
0)<>mrYes then exit;
   DoTime1 := MessageDlg('Do you also want to time the build process', 
mtConfirmation, mbYesNo, 0) = mrYes;

   if DoTime1 then begin
        Times1:= TStringList.Create;
        StartTime1 := Now();

     if DoTime1 then begin
         EndTime1 := Now();
         Path1 := 
IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + 
         MilliSecs1 := MilliSecondsBetween(StartTime1, EndTime1);
         if FileExists(Path1) then Times1.LoadFromFile(Path1);

More information about the fpc-devel mailing list