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每次調用內部都會實例化一次。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章