VC++.net 7 與 C++Builder6 編譯評測!! |
|
enter2004
初階會員 發表:51 回覆:94 積分:34 註冊:2005-04-10 發送簡訊給我 |
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 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |