Delphi2007以后编译器进步的简单测试

刚刚看了有个兄弟用最新的FreePascal和Delphi7的编译器评测.觉得有点不公平.毕竟D7是10年前的产品.现在Delphi都出到XE3了.

用了个简单的代码测试了一下Delphi编译器的变化.

涵盖Delphi的版本XE3,XE2,XE,2007

测试代码如下

program matrix;

{$APPTYPE CONSOLE}
{$DEFINE USEINLINE}

uses
Windows;

const
SIZE = 30;
msg =
{$IFDEF DEBUG}
'Debug Version'
{$ELSE}
'Release Version'
{$ENDIF}
+
{$IFDEF USEINLINE}
' inline'
{$ELSE}
'!inline'
{$ENDIF}
;
type TMatrix = array[0..SIZE-1, 0..SIZE-1] of integer;

procedure mkmatrix( rows, cols : integer; var mx : TMatrix); {$IFDEF USEINLINE}inline;{$ENDIF}
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); {$IFDEF USEINLINE}inline;{$ENDIF}
var
i, j, k, val: integer;
begin
Dec(rows); Dec(cols);
for i:=0 to rows do
for j:=0 to cols do begin
val:=0;
for k:=0 to cols do
Inc(val, m1[i,k]*m2[k,j]);
mm[i,j] := val;
end;
end;

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

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

顺便测试了一下inline的效率.

编译好在控制台运行,给100000的参数,也就是循环十万次

XE3 Release inline???????? 2013 1997
XE3 Release not use inline 2574 2574

XE2 Release inline???????? 2013 1997
XE2 Release not use inline 2574 2574

XE Release inline???????? 2574 2574
XE Release not use inline 2044 2044

2007 Release inline???????? 2605 2621
2007 Release not use inline 2590 2589

从结果上可以看出XE2的编译器效率等同于XE3.这两个版本编译器效率方面变化不大.

但是诡异的事情来了,在XE和2007版本上inline居然比不使用inline代码的效率更低,闪瞎我的眼睛啊.瞪大了眼睛完完全全重新测试几次之后都是这个结果.我只好认命了,也许是我这段代码本身对这两个编译是个特例.

又用Delphi2007去掉了编译器优化Optimization选项.这下看到inline的效果了.

2007 Debug inline???????? 8097 8097
2007 Debug not use inline 8236 8236

也就是在Delphi2007(也包括XE)中代码优化有时候会把inline弄得更糟.或者可以这么说,在Delphi2007(也包括XE)中line优化做的还没有非inline优化做得好,直到XE2情况才发生改变.由于我手里没有Delphi2010对Delphi2010就不做评测了.

从数据可以看出Delphi编译器的效率还是有一定的提升.特别是inline函数的优化上,有大幅度的提升.估计他们最近几个版本在这方面下了功夫,毕竟最近优化了泛型机制,泛型和inline很多地方是相通的.

有兴趣的朋友们可以用上面的代码做一下Delphi7和其他版本Delphi在相同环境下的效率.

此条目发表在Delphi分类目录。将固定链接加入收藏夹。

Delphi2007以后编译器进步的简单测试》有 1 条评论

  1. Pingback引用通告: buy cialis

发表评论

电子邮件地址不会被公开。

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

你必须启用JavaScript