慶祝Lazarus1.0發(fā)布!Delphi和Freepascal的性能比較例子 好久沒有關(guān)注freepascal和lazarus,前兩天一看,lazarus居然已經(jīng)發(fā)布了1.0正式版,下載了一個windows版,一試,感覺比較爽,IDE好像已經(jīng)強過DELPHI7(我一直用DELPHI7),中文的問題好像已經(jīng)沒有了。有關(guān)生成的可執(zhí)行的文件太大的問題也試了一下,缺省的文件還是比較大的。試了它里面的幾個例子,都是十幾兆,把編譯開關(guān)重新調(diào)整了一下,一個是除去調(diào)試信息,一個是作SMARTLINK,大小減少到2兆多,可以接受。不過有調(diào)試信息也是有意義的,出了問題可以知道是程序哪一行有問題。 我原來看過幾年前有人寫過的一篇關(guān)于DELPHI和Freepascal的性能比較文章,說是DELPHI比Freepascal快差不多10-30%,在有數(shù)學函數(shù)的運算中,差距超過30%,但昨天我作的測試結(jié)果完全顛覆了這個說法。在我的測試中發(fā)現(xiàn)除了顯示部分,F(xiàn)reepascal性能已經(jīng)超過了DELPHI。 現(xiàn)在我把我昨天晚上作的關(guān)于DELPHI和freepascal的幾個性能測試例子發(fā)布一下: (1)平衡二叉樹的創(chuàng)建 const cBase64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; cBase64Len=Length(cBase64); procedure TForm1.Button1Click(Sender: TObject); var i:Integer; Node:TAVLTreeNode; Image:TImage; T1,T2:TDateTime; begin T1:=Now; Tree.Clear; RandSeed:=1; DrawCount:=1; for i:=1 to 20*10000 do begin DrawCount:=(DrawCount+1) mod 2; Image:=TImage(FindComponent('Image'+IntToStr(DrawCount+1))); // Image.Canvas.FillRect(Image.ClientRect); // Tree.DrawTreeNode(Image.Canvas); Node:=TAVLTreeNode.Create; Node.Key:=cBase64[Random(cBase64Len)+1]; // ShowMessage('Button1: Begin'+IntToStr(i)+' '+Node.Key); Tree.Add(Node); DrawCount:=(DrawCount+1) mod 2; Image:=TImage(FindComponent('Image'+IntToStr(DrawCount+1))); // Image.Canvas.FillRect(Image.ClientRect); // Tree.DrawTreeNode(Image.Canvas); // ShowMessage('Button1: End'+IntToStr(i)); end; T2:=Now; ShowMessage(IntToStr(Round((t2-t1)*24*3600*1000))); end; 擔心random產(chǎn)生不同的結(jié)果,我自己寫了一個隨機數(shù)發(fā)生函數(shù),保證DELPHI和FREEPASCAL都產(chǎn)生相同的樹。 運行結(jié)果是: DELPHI耗時234ms Freepascal耗時141ms (2)平衡二叉樹的釋放和創(chuàng)建 把上面的代碼再執(zhí)行一篇,相當于把上次的創(chuàng)建的樹釋放,然后重新創(chuàng)建一遍 第二次運行的是 DELPHI耗時328ms Freepascal耗時187ms (3)平衡二叉樹的查找 var s:string; i:Integer; T1,T2:TDateTime; begin T1:=Now; for i:=1 to 1000*1000 do begin s:=cBase64[Random(cBase64Len)+1]; Tree.Find(s); end; T2:=Now; ShowMessage(IntToStr(Round((t2-t1)*24*3600*1000))); end; DELPHI耗時218ms Freepascal耗時141ms (4)數(shù)學運算 var s:string; i:Integer; T1,T2:TDateTime; begin T1:=Now; for i:=1 to 1000*1000 do begin RandSeed:=round(math.power(10.5,3.2)+log10(1000*25*123)+sqrt(22*55)+math.sinh(1.2)*100)*100; // s:=cBase64[Random(cBase64Len)+1]; // Tree.Find(s); end; T2:=Now; ShowMessage(IntToStr(Round((t2-t1)*24*3600*1000))); end; DELPHI耗時235ms Freepascal耗時218ms (5)在畫布上顯示 var i:Integer; Node:TAVLTreeNode; Image:TImage; T1,T2:TDateTime; begin T1:=Now; Tree.Clear; RandSeed:=1; DrawCount:=1; for i:=1 to 200 do begin DrawCount:=(DrawCount+1) mod 2; Image:=TImage(FindComponent('Image'+IntToStr(DrawCount+1))); Image.Canvas.FillRect(Image.ClientRect); Tree.DrawTreeNode(Image.Canvas); Node:=TAVLTreeNode.Create; Node.Key:=cBase64[Random(cBase64Len)+1]; // ShowMessage('Button1: Begin'+IntToStr(i)+' '+Node.Key); Tree.Add(Node); DrawCount:=(DrawCount+1) mod 2; Image:=TImage(FindComponent('Image'+IntToStr(DrawCount+1))); Image.Canvas.FillRect(Image.ClientRect); Tree.DrawTreeNode(Image.Canvas); // ShowMessage('Button1: End'+IntToStr(i)); end; T2:=Now; ShowMessage(IntToStr(Round((t2-t1)*24*3600*1000))); end; DELPHI耗時312ms Lazarus耗時688ms 以上使用的DELPHI版本是 Lite Edition v7.3.4.1(Build8.1),FreePascal版本是2.6 總結(jié):Freepascal在編譯效果上基本上不輸DELPHI,并且還強不少,并且Freepascal已經(jīng)64位很長時間了,特別是在多種硬件平臺和多種操作系統(tǒng)上都能編譯運行。不過DELPHI7在畫布上的顯示速度明顯超過Lazarus,這可能是因為Lazarus支持多種顯示平臺(win32、gtk、gtk2、carbon、qt、wince、fpgui、cocoa、android),多包了一層。lanzarus上的基本控件和DELPHI相比,有多有少??梢哉flazarus可以進入實用階段了。 以后有一部分程序可能會考慮用Lanzarus進行開發(fā)。有可能會和DELPHI混用。至少服務(wù)器肯定考慮用Freepascal了,因為Freepascal原生提供了比DELPHI原生提供多得多的大量的函數(shù)和組件(包括我上面使用的平衡二叉樹就是一個例子,其它還有鏈表,雜湊、加密、壓縮、CGI等),并且寫服務(wù)器軟件,有關(guān)DELPHI代碼轉(zhuǎn)到Freepascal代碼比較容易。DELPHI上大量的第三方比較好的報表和顯示控件要轉(zhuǎn)到Lazarus還是不太容易,如果不考慮第三方控件,Lazarus已經(jīng)完全可以替換Delphi了,但這些優(yōu)秀的第三方顯示和報表控件還是很難割舍的。 |
|