vc与bcb最优化代码测试(1)

类别:编程语言 点击:0 评论:0 推荐:

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

本文地址:http://com.8s8s.com/it/it28767.htm