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

原创 2004年06月24日 11:05:00

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

代码测试、调试与优化小结

代码测试、调试与优化小结 代码写完以后往往要做测试(或验证)、调试,可能还要优化。     关于测试(或验证),通常对应着两个英文单词verification和validation,在资料[1...
  • dayancn
  • dayancn
  • 2016年03月19日 07:02
  • 1200

cache测试及其矩阵优化

利用c/c++测试电脑的cache参数 1. 指令yu'qu
  • GVFDBDF
  • GVFDBDF
  • 2015年11月13日 14:50
  • 2237

带你玩转Visual Studio——性能分析与优化

二八法则适合很多事物:最重要的只占其中一小部分,约20%,其余80%的尽管是多数,却是次要的。在程序代码中也是一样,决定应用性能的就那20%的代码(甚至更少)。因此优化实践中,我们将精力集中优化那20...
  • luoweifu
  • luoweifu
  • 2016年05月21日 23:24
  • 27512

[C] 让VC支持C99的整数类型V1.01。避免包含目录问题,更名auto_stdint.h、auto_inttypes.h(在VC6至VC2012、GCC、BCB等编译器下测试通过)

作者:zyl910   以前我曾为了让VC++等编译器支持C99的整数类型,编写了同名的stdint.h、inttypes.h来智能处理(http://www.cnblogs.com/zyl91...
  • dyllove98
  • dyllove98
  • 2013年05月31日 23:13
  • 2221

最优化问题中的测试函数

  • 2017年02月04日 21:32
  • 107B
  • 下载

Agilent Medalist i3070 测试程序最优化

  • 2017年10月31日 17:58
  • 1.25MB
  • 下载

VC++用MKL进行最优化计算的示例源程序

  • 2015年12月08日 23:26
  • 11KB
  • 下载

最优化方面的matlab工具代码2015b以上版

  • 2017年11月10日 10:20
  • 341KB
  • 下载

最优化SQP完整代码

  • 2013年11月22日 19:45
  • 12KB
  • 下载

最优化算法第五章1

  • 2011年10月28日 10:27
  • 226KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:vc与bcb最优化代码测试(1)
举报原因:
原因补充:

(最多只允许输入30个字)