我刚刚才知道Delphi XE4 已经有官方自带的正则组件RegularExpressions 。然后试了一下,感觉简洁实用,蛮喜欢的。于是就对平时该使用哪个有了点小小的纠结。我是用惯了PerlRegEx 从D7的时候就用上了。遂想对它们的执行速度做个测试。
我测试是这样的,定义一段字串
然后分别用不同的组件去匹配找出一段由字母组成的字串,然后继续,就这样循环1000次。次数多了,才容易计算它们执行时间差。
考虑到实例化的速度的影响,我对PerlRegEx 的测试分了两个,一个是实例化一次,多次循环使用(按钮名:PerlRegEx)。一个实例化在循环内,用一次实例化一次(按钮名:PerlRegEx2)。
测试如下:
测试代码:
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;
type
TfrmSpeedTest = class(TForm)
btnPerlReg: TButton;
btnRegularExpressions: TButton;
mmoLog: TMemo;
btnPerlRegEx2: TButton;
procedure btnPerlRegClick(Sender: TObject);
procedure btnRegularExpressionsClick(Sender: TObject);
procedure btnPerlRegEx2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
frmSpeedTest: TfrmSpeedTest;
const
sblog = '0123456789http://blog.csdn.net/MichaelJScofield';
implementation
uses
System.RegularExpressions,
PerlRegEx;
{$R *.dfm}
{ 使用TPerlRegEx类 }
procedure TfrmSpeedTest.btnPerlRegClick(Sender: TObject);
var
reg: TPerlRegEx;
s1,s2: Int64;
i,iCounter: Integer;
begin
reg := TPerlRegEx.Create;
iCounter := 0;
QueryPerformanceCounter(s1);
for I := 0 to 1000 do
begin
reg.Subject := sblog;
reg.RegEx := '[a-zA-Z]+';
if reg.Match then Continue;
end;
QueryPerformanceCounter(s2);
iCounter := s2-s1;
mmoLog.Lines.Add('PerlRegEx:'+inttostr(iCounter));
reg.Free
end;
{ 使用TPerlRegEx类:把实例化过程放到循环中 }
procedure TfrmSpeedTest.btnPerlRegEx2Click(Sender: TObject);
var
reg: TPerlRegEx;
s1,s2: Int64;
i,iCounter: Integer;
begin
iCounter := 0;
QueryPerformanceCounter(s1);
for I := 0 to 1000 do
begin
reg := TPerlRegEx.Create;
reg.Subject := sblog;
reg.RegEx := '[a-zA-Z]+';
if reg.Match then Continue;
reg.Free
end;
QueryPerformanceCounter(s2);
iCounter := s2-s1;
mmoLog.Lines.Add('PerlRegEx2:'+inttostr(iCounter));
end;
{ 使用RegularExpressions的TRegEx }
procedure TfrmSpeedTest.btnRegularExpressionsClick(Sender: TObject);
var
reg: TMatch;
s1,s2: Int64;
i,iCounter: Integer;
begin
iCounter := 0;
QueryPerformanceCounter(s1);
for I := 0 to 1000 do
begin
reg := TRegEx.Match(sblog,'[a-zA-Z]+');
if reg.Success then Continue;
end;
QueryPerformanceCounter(s2);
iCounter := s2-s1;
mmoLog.Lines.Add('RegularExpressions:'+inttostr(iCounter));
end;
end.
代码打包下载:http://download.csdn.net/detail/michaeljscofield/7844049
实例化一次,多次复用的PerlRegEx速度杠杠的,快了40几倍。每次实例化的话,速度就和官方组件相差不是很多了。
相对来说,PerlRegEx要相对灵活一点,可以实例化一次就多次使用。而ReguarExpressions的TRegEx每次调用内部都会实例化一次。