程序如下
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%以上,以前没有想到会有这样的差别,还是其它什么什么问题,关于编译设置我大概检查了一下,没有问题。
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%以上,以前没有想到会有这样的差别,还是其它什么什么问题,关于编译设置我大概检查了一下,没有问题。
我注意的问题的两个编译器的优化效果问题。
了解了这个,为什么Win7上VC8编译的程序速度慢原因就简单了。
程序如下:
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没有此优化的结果。