# [fpc-pascal]Performance: Free Pascal vs GNU Pascal

Florian Klaempfl Florian.Klaempfl at gmx.de
Sun Dec 29 17:08:57 CET 2002

```Mark Emerson wrote:
> Look at
>
>
> Thank you for this VALUABLE reference.  Let me ask (if I may)...on
> matrix multiplication, which appears to be a pretty clean, simple
> algorithm, why do you suppose Microsoft C (vc, and also vc++) is more
> than three times faster than FPC?

Because it's unfair :( :

Delphi test code:

-------------------------------

program matrix;

const
SIZE = 30;

type TMatrix = array[0..SIZE-1, 0..SIZE-1] of integer;

procedure mkmatrix( rows, cols : integer; var mx : TMatrix);
var
R, C, count : integer;
begin
Dec(rows); Dec(cols);
count:=1;
for R:=0 to rows do
for C:=0 to cols do begin
mx[R, C] := count;
Inc(count);
end;
end;

procedure mmult(rows, cols: integer; const m1, m2: TMatrix; var mm: TMatrix);

[...]

var NUM, code, i: integer;
M1, M2, MM: TMatrix;
begin
NUM:=1;
if ParamCount=1 then Val(ParamStr(1),NUM,code);

mkmatrix(SIZE, SIZE, M1);
mkmatrix(SIZE, SIZE, M2);
for i:=0 to NUM do
mmult(size, size, M1, M2, MM);
WriteLn( MM[0, 0],' ',MM[2, 3],' ',MM[3, 2],' ',MM[4, 4]);
end.

-------------------------------

FPC test code:

program matrix;
uses SysUtils;

const
size = 30;

type tMatrix = array[0..size, 0..size] of longint;

procedure mkmatrix( rows, cols : integer; var mx : tMatrix);
var
R, C : integer;
count : longint;
begin
Dec(rows);
Dec(cols);
count := 1;
for R := 0 to rows do
begin
for C := 0 to cols do
begin
mx[R, C] := count;
Inc(count);
end;
end;
End;

procedure mmult(rows, cols : integer; m1, m2 : tMatrix; var mm : tMatrix );

[...]

var NUM, I : integer;
M1, M2, MM : tMatrix;

begin
if ParamCount = 0 then
NUM := 1
else
NUM := StrToInt(ParamStr(1));

if NUM < 1 then NUM := 1;

mkmatrix(size, size, M1);
mkmatrix(size, size, M2);

for I := 0 To NUM do
begin
mmult(size, size, M1, M2, MM);
end;
WriteLn( IntToStr(MM[0, 0]) + ' ' + IntToStr(MM[2, 3]) + ' ' +
IntToStr(MM[3, 2]) + ' ' + IntToStr(MM[4, 4]));
end.

-------------------------------

Note the matrix sizes and the calling conventions: passing by const is much
faster than parameter passing by value. Further, test with float, integer
matrix operations are very unlikely :)

```