On Mon, Apr 28, 2014 at 09:29:50PM +0200, Mattias Gaertner wrote: > On Mon, 28 Apr 2014 21:14:14 +0200 > Petr Kristan <petr.kris...@epos.cz> wrote: > > >[...] > > > Others would be better positioned for more detailed comparison among > > > various heap managers with regard to speed in different use cases, overall > > > memory requirements achieved by reuse of previously allocated memory, etc. > > Reuse of previously allocated memory - it really can be my problem. > > Here is about 200x call ReAllocMem increasing buffer from 4kB to 80MB. > > Check if you are increasing buffers in constant steps. > Change the increment to exponentially. I use "inteligent" block increasing. I can optimize program, but why is fpc heap manager to slow?
Here is the sample stress program compilable with fpc, delphi and kylix: program m; {$IFDEF MSWINDOWS} {$APPTYPE CONSOLE} {$ENDIF} uses {$IFDEF MSWINDOWS} Windows, {$ELSE} {$IFDEF FPC} Unix, {$ELSE} Libc, {$ENDIF} {$ENDIF} SysUtils; {$IFDEF MSWINDOWS} function GetTickCount: Cardinal; begin GetTickCount := Windows.GetTickCount; end; {$ELSE} {$IFDEF FPC} function GetTickCount: Cardinal; var tp: TTimeVal; begin fpgettimeofday(@tp, nil); GetTickCount := (Int64(tp.tv_sec) * 1000) + (tp.tv_usec div 1000); end; {$ELSE} function GetTickCount: Cardinal; var ts: TTimeSpec; i: Int64; const CLOCK_MONOTONIC = 1; begin if clock_gettime(CLOCK_MONOTONIC, ts) <> 0 then begin Result := 0; Exit; end; i := ts.tv_sec; i := i*1000 + ts.tv_nsec div 1000000; Result := i and $ffffffff; end; {$ENDIF} {$ENDIF} var p1, p2: Pointer; i, j: integer; ms, sum: Cardinal; const base = 1000000; begin sum := GetTickCount; for i := 0 to 10 do begin ms := GetTickCount; for j := 1 to 9 do begin ReAllocMem(p1, base*(i*10+j)); ReAllocMem(p2, base*(i*10+j)); end; Writeln(Format('Grow %d-%d %dms', [base*i*10, base*(i*10+9), GetTickCount-ms])); end; FreeMem(p1); FreeMem(p2); Writeln(Format('Sum %dms', [GetTickCount-sum])); end. -------------------------------------------------------------------------------- And here are results: ppcx64 m.pas Free Pascal Compiler version 2.7.1 [2014/02/17] for x86_64 Target OS: Linux for x86-64 Grow 0-9000000 89ms Grow 10000000-19000000 281ms Grow 20000000-29000000 488ms Grow 30000000-39000000 716ms Grow 40000000-49000000 898ms Grow 50000000-59000000 1085ms Grow 60000000-69000000 1294ms Grow 70000000-79000000 1470ms Grow 80000000-89000000 1652ms Grow 90000000-99000000 1916ms Grow 100000000-109000000 2099ms Sum 12007ms ppcx64 -gv m.pas Free Pascal Compiler version 2.7.1 [2014/02/17] for x86_64 Target OS: Linux for x86-64 Grow 0-9000000 0ms Grow 10000000-19000000 0ms Grow 20000000-29000000 1ms Grow 30000000-39000000 0ms Grow 40000000-49000000 0ms Grow 50000000-59000000 0ms Grow 60000000-69000000 2ms Grow 70000000-79000000 3ms Grow 80000000-89000000 2ms Grow 90000000-99000000 0ms Grow 100000000-109000000 0ms Sum 10ms ppc386 m.pas Free Pascal Compiler version 2.7.1 [2013/06/28] for i386 Target OS: Linux for i386 Grow 0-9000000 86ms Grow 10000000-19000000 247ms Grow 20000000-29000000 417ms Grow 30000000-39000000 595ms Grow 40000000-49000000 781ms Grow 50000000-59000000 964ms Grow 60000000-69000000 1128ms Grow 70000000-79000000 1288ms Grow 80000000-89000000 1438ms Grow 90000000-99000000 1612ms Grow 100000000-109000000 1767ms Sum 10341ms ppc386 -gv m.pas Free Pascal Compiler version 2.7.1 [2013/06/28] for i386 Target OS: Linux for i386 Grow 0-9000000 0ms Grow 10000000-19000000 0ms Grow 20000000-29000000 0ms Grow 30000000-39000000 0ms Grow 40000000-49000000 0ms Grow 50000000-59000000 0ms Grow 60000000-69000000 1ms Grow 70000000-79000000 0ms Grow 80000000-89000000 0ms Grow 90000000-99000000 0ms Grow 100000000-109000000 0ms Sum 1ms dcc m.pas Borland Delphi for Linux Version 14.5 Grow 0-9000000 0ms Grow 10000000-19000000 0ms Grow 20000000-29000000 0ms Grow 30000000-39000000 0ms Grow 40000000-49000000 0ms Grow 50000000-59000000 0ms Grow 60000000-69000000 0ms Grow 70000000-79000000 0ms Grow 80000000-89000000 0ms Grow 90000000-99000000 0ms Grow 100000000-109000000 0ms Sum 2ms fpc m.pas Free Pascal Compiler version 2.7.1 [2013/12/27] for i386 Target OS: Win32 for i386 Grow 0-9000000 47ms Grow 10000000-19000000 157ms Grow 20000000-29000000 359ms Grow 30000000-39000000 531ms Grow 40000000-49000000 656ms Grow 50000000-59000000 797ms Grow 60000000-69000000 985ms Grow 70000000-79000000 1109ms Grow 80000000-89000000 1250ms Grow 90000000-99000000 1406ms Grow 100000000-109000000 1532ms Sum 8829ms dcc m.pas Borland Delphi Version 15.0 Grow 0-9000000 16ms Grow 10000000-19000000 31ms Grow 20000000-29000000 47ms Grow 30000000-39000000 47ms Grow 40000000-49000000 109ms Grow 50000000-59000000 63ms Grow 60000000-69000000 62ms Grow 70000000-79000000 250ms Grow 80000000-89000000 266ms Grow 90000000-99000000 94ms Grow 100000000-109000000 110ms Sum 1125ms (Windows is virtual machine) Is possible to speedup heap manager? Petr -- Petr Kristan . EPOS PRO s.r.o., Smilova 333, 530 02 Pardubice tel: +420 461101401 Czech Republic (Eastern Europe) fax: +420 461101481 _______________________________________________ fpc-devel maillist - fpc-devel@lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel