全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:2115
推到 Plurk!
推到 Facebook!

VC++.net 7 與 C++Builder6 編譯評測!!

 
enter2004
初階會員


發表:51
回覆:94
積分:34
註冊:2005-04-10

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-08-20 18:44:17 IP:218.170.xxx.xxx 未訂閱
http://purec.binghua.com/Article/Class1/Class2/200406/230.html vc與bcb最優化代碼測試 作者:瀟寒 工具: vc 版本 7.0 bcb 版本 6.0 編譯選項:最大速度優化,(VC 7.0關掉自動內聯函數選項) 反編譯工具:w32dasm 基準測試程序: void test() { int a = 0 , b = 1 , c = 4 ; for( int i = 0 ; i < b c ; i ){ a ; } } int main() { __asm{ mov edx , edx nop } ; test() ; } 目的,測試程序對無用函數的優化能力,由於test不返回任何值,也不修改任何外部變量, 因此,對程序來說,這是個無效函數,一個優秀的編譯器可以優化掉它。 VC的編譯結果: //-------------------------------------------------main()----------------------- - :00401000 8BD2 mov edx, edx :00401002 90 nop // 沒調用test(), very good!!! :00401003 C3 ret //-------------------------------------------------main() finished-------------- BCB的編譯結果: //---------------------------------------------------main() -------------- :00401184 89D2 mov edx, edx :00401186 90 nop :00401187 E8DCFFFFFF call 00401168 // 調用test(), bad!!! :( :0040118C 33C0 xor eax, eax :0040118E C3 ret //---------------------------------------------------main() finished------- 從上面的結果看出,vc在這一項表現上,相當不錯,bcb就有點垃圾了 vc vs bcb === 1 : 0 基準測試程序 int global = 0 ; int test() { int a = 0 , b = 3 , c = 4 ; for( int i = 0 ; i < b c ; i ){ a ; global ; } return global ; } int main() { __asm{ mov edx , edx nop } ; return test() ; } 目的:測試對於函數中無效變量的優化能力,test()函數中的a是無用變量,優秀的編譯 器應當優化掉它。 vc的測試結果: //-----------------------------------------------main()-------------------- :00401000 8BD2 mov edx, edx :00401002 90 nop :00401003 A1C0724000 mov eax, dword ptr [004072C0] :00401008 83C007 add eax, 00000007 // !!!!!!!!! 恐怖 !!!! :0040100B A3C0724000 mov dword ptr [004072C0], eax :00401010 C3 ret //------------------------------------------------main() finished---------- -- bcb的測試結果 //---------------------------------------------main()------------------- :0040118C 89D2 mov edx, edx :0040118E 90 nop :0040118F E8D4FFFFFF call 00401168 // bad :00401194 C3 ret //---------------------------------------------main() finished---------- //--------------------------------------------test()---------------------- :00401168 53 push ebx :00401169 BA03000000 mov edx, 00000003 // b = 3 :0040116E B904000000 mov ecx, 00000004 // c = 4 :00401173 33C0 xor eax, eax // i = 0 :00401175 EB07 jmp 0040117E :00401177 FF05A4204000 inc dword ptr [004020A4] // global :0040117D 40 inc eax // i // 沒有 a ; good!!! :0040117E 8D1C11 lea ebx, dword ptr [ecx edx] // ebx = b c = 7 :00401181 3BC3 cmp eax, ebx :00401183 7CF2 jl 00401177 :00401185 A1A4204000 mov eax, dword ptr [004020A4] :0040118A 5B pop ebx :0040118B C3 ret //--------------------------------------------test() finished-------------- 結果總結: vc在這一項上的表現令人不得不感到恐怖,它居然從程序邏輯上進行優化,直接算出了 global的值,然後直接嵌入main()中,這裡所表現出來的編譯器己經相當智能了!!! bc在這一項上的表現與vc相比就相當中規中矩了!首先,main()函數照常調用test() 在test()中,bcb表現出來了一些高級優化手段,首先,沒有多次計算條件變量b c, 而是計算一次後存放於edx中,避免了在每次循環的時候,都計算條件變量, 其次,優化掉了無效變量a,總的來說,還算差強人意,但與vc比其來,實在是天地之 別了,光這一項上,vc的執行程序效率就要比bcb高了不止一個數量級! 實在是恐怖,看來至從Anders加盟ms後,vc在編譯器技術上的進步是瘋狂的,而bcb 卻落後太多了~~~55555~~~~ 不過,從一個側面體顯出,能手動優化就手動優化,因為,你無法知道是不是每個編譯 器都能有足夠的智能~~~
------
人生就像泡泡一樣,乘著風被吹著跑,等你發現時已經消失了。
就在快要消失的瞬間,希望能再飛高一點,
但是回神時總是慢了一步。
aip999
初階會員


發表:10
回覆:63
積分:44
註冊:2002-03-29

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-09-01 10:09:58 IP:218.162.xxx.xxx 未訂閱
怎不試試 傳值 傳址 ^^
系統時間:2024-05-18 6:52:41
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!