Delphi 比较第三方正则组件 PerlRegEx 和 官方的 RegularExpressions 速度测试

我刚刚才知道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每次调用内部都会实例化一次。

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值