程序如下
DWORD begintick;
DWORD len;
begintick=::GetTickCount();
char *p;
for(i=0;i<40000000;i++)
{int ik;
p=new char [2000];
for(ik=0;ik<2000;ik++)
p[ik]=ik;
delete p;
}len=::GetTickCount()-begintick;
printf(" the len=%d",len);使用64位程序 RELEASE(没试32位的) 在同一台机上运行,结果两个之间的速度差别在10%以上,以前没有想到会有这样的差别,还是其它什么什么问题,关于编译设置我大概检查了一下,没有问题。

解决方案 »

  1.   

    反汇编了一下    发现一个用INC  一个用 ADD 1   指令不知是不是这个原因,    以后测试了一下, 将p[ik]=ik;改成p[ik]=8;后速度又基本上一致了。
      

  2.   

    delete []p;这样才更好。
      

  3.   

    delete []p; delete p;效果是一样的,p 指的不是对象。
    我注意的问题的两个编译器的优化效果问题。
      

  4.   

    涉及new的,就跟系统的库有关了,如果比较优化效果,看汇编代码就行。
      

  5.   

    查出来了,可能是NEW DELETE 的效率问题。VS2005的 NEW 执行要慢。
      

  6.   

    Win7其实为回教异化的XP。VC8为荷兰版,虽然前一阵荷兰比较混乱,但荷兰还是盟军的一员。
    了解了这个,为什么Win7上VC8编译的程序速度慢原因就简单了。
      

  7.   

    无profiler不要谈效率!!尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代!
      

  8.   

    我检查了一下发现两者的编译器还是有一定性能上差别的,去NEW DELETE 操作
    程序如下:
    DWORD i;
    DWORD begintick;
    DWORD len;
    char *p;  p = new char[2000];begintick = ::GetTickCount();
    for (i = 0; i<40000000; i++)
    {
    int ik;
      for (ik = 0; ik<2000; ik++)
     {
      p[ik] = ik;
      } }
     len = ::GetTickCount() - begintick;
    delete p;
    printf(" the len=%d", len);VS2015 编译如下
      
     for (ik = 0; ik<2000; ik++)
    000000013FE11040  xor         ecx,ecx  
    000000013FE11042  mov         rdx,rbx  
    000000013FE11045  nop         word ptr [rax+rax]  
     {
      p[ik] = ik;
    000000013FE11050  mov         byte ptr [rdx],cl  
    000000013FE11052  lea         rdx,[rdx+1]  
    000000013FE11056  inc         ecx  
    000000013FE11058  cmp         ecx,7D0h  
    000000013FE1105E  jl          main+50h (013FE11050h)  
    for (i = 0; i<40000000; i++)
    000000013FE11060  sub         r8,1  
    000000013FE11064  jne         main+40h (013FE11040h)  
     
     }VS2005 编译如下
     for (ik = 0; ik<2000; ik++)
    0000000000401030  xor         ecx,ecx 
    0000000000401032  mov         rdx,rbx 
    0000000000401035  xchg        ax,ax 
    0000000000401039  xchg        ax,ax 
    000000000040103C  xchg        ax,ax 
     {
      p[ik] = ik;
    0000000000401040  mov         byte ptr [rdx],cl 
    0000000000401042  add         ecx,1 
    0000000000401045  add         rdx,1 
    0000000000401049  cmp         ecx,7D0h 
    000000000040104F  jl          wmain+40h (401040h) 
    for (i = 0; i<40000000; i++)
    0000000000401051  sub         r8,1 
    0000000000401055  jne         wmain+30h (401030h) 
     
     }
    两者执行速度差别在10%。更为想不到的是如果改p[ik] = ik;为p[ik] =8时
    VS2015 执行显示为0,反汇编了一下,没有相应代码,也就是此时编译器已经知道了此代码为无效代码。
    但VS2005没有此优化的结果。