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