工具:
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~~~~
不过,从一个侧面体显出,能手动优化就手动优化,因为,你无法知道是不是每个编译
器都能有足够的智能~~~
原文:http://purec.binghua.com/Article/ShowArticle.asp?ArticleID=230