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