工具: 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 
|