高分求助,关于release版本和debug版本问题

tgh621 2010-01-04 04:58:04
我自己练习写了一段代码,发现debug运行得比release快很多,百思不得其解,所以希望大家不吝赐教


#include <Windows.h>
#include <emmintrin.h>

int add(int a,int b)
{
int c;
__asm
{
push eax;
mov eax,[a];
add eax,[b];
mov [c],eax;
pop eax;
}
return c;
}
void mymemcpy(void* pDes, void* pSrc,int nByte)
{
__asm
{
push eax;
push ebx;
push ecx;
mov eax,pDes;
mov ebx,pSrc;
mov ecx,nByte
sub ecx,80h;
loop1:
movdqa xmm0,xmmword ptr[eax];
movdqa xmm1,xmmword ptr[eax];
movdqa xmm2,xmmword ptr[eax];
movdqa xmm3,xmmword ptr[eax];
movdqa xmm4,xmmword ptr[eax];
movdqa xmm5,xmmword ptr[eax];
movdqa xmm6,xmmword ptr[eax];
movdqa xmm7,xmmword ptr[eax];

movdqa xmmword ptr[ebx],xmm1;
movdqa xmmword ptr[ebx],xmm2;
movdqa xmmword ptr[ebx],xmm3;
movdqa xmmword ptr[ebx],xmm4;
movdqa xmmword ptr[ebx],xmm5;
movdqa xmmword ptr[ebx],xmm6;
movdqa xmmword ptr[ebx],xmm7;
add eax,80h;
add ebx,80h;
sub ecx,80h;
jnb loop1;
pop ecx;
pop ebx;
pop eax;

}

}
void* CALLBACK TP_Memcpy(IN OUT void* pDest,
IN const void* pSrc,
IN int nSize)
{
if(nSize==0||pSrc==NULL || pDest==NULL)
return NULL;
void *pTemp = pDest;

__asm
{
MOV EDX, pSrc
MOV EBX, pTemp
Mov EAX, nSize

neg eax // EAX取相反数,CF标识其是否为0
add eax, 63
jbe skipblastloop // CF或ZF为1时跳转
blastloop:
movq mm0, [edx] // 一次8×8=64个字节
movq mm1, [edx+8]
movq mm2, [edx+16]
movq mm3, [edx+24]
movq mm4, [edx+32]
movq mm5, [edx+40]
movq mm6, [edx+48]
movq mm7, [edx+56]
movntq [ebx], mm0
movntq [ebx+8], mm1
movntq [ebx+16], mm2
movntq [ebx+24], mm3
movntq [ebx+32], mm4
movntq [ebx+40], mm5
movntq [ebx+48], mm6
movntq [ebx+56], mm7
add ebx, 64
add edx, 64
add eax, 64
jnc blastloop // 没有进位(CF=0)则跳转
skipblastloop:
sub eax, 63-7
jns noextras // SF=0
quadloop:
movq mm0, [edx] // 一次8个字节
movntq [ebx], mm0
add edx, 8
add ebx, 8
add eax, 8
jnc quadloop
noextras:
sub eax, 7 // 一次1个字节
jz nooddballs
mov ecx, eax
neg ecx
mov esi, edx
mov edi, ebx
rep movsb // 重复复制1个字节,ECX次,从ESI到EDI
nooddballs:
EMMS
}
return pDest;
}
int _tmain(int argc, _TCHAR* argv[])
{
char* p=(char*)_mm_malloc(1024*1024*500,16);
unsigned int t1= GetTickCount();
mymemcpy(p,p,1024*1024*500);
t1=GetTickCount()-t1;
printf("%u\n",t1);
t1= GetTickCount();
memcpy(p,p,1024*1024*500);
t1=GetTickCount()-t1;
printf("%u\n",t1);
t1= GetTickCount();
TP_Memcpy(p,p,1024*1024*500);
t1=GetTickCount()-t1;
printf("%u\n",t1);
_mm_free(p);
getchar();
return 0;
}

我经过对比发现,release版本里面 runtime library 选择的是/MD,而debug版本里面选择的是/MDD
就是因为这儿选择不一样造成了速度变慢,我就是想知道,为什么选择/MD比选择/MDD运行怎么效率低了一半
...全文
172 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tgh621 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 macrojj 的回复:]
不是应该debug版本的慢吗 学习
[/Quote]
如果是debug版本慢我就不用来问了
macrojj 2010-01-04
  • 打赏
  • 举报
回复
不是应该debug版本的慢吗 学习
tgh621 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 traceless 的回复:]
如描叙那样编译上述代码,并执行,没有出现你所说的反差状况
[/Quote]
你输出的结果是多少呀
s446721902 2010-01-04
  • 打赏
  • 举报
回复
不懂帮顶
老邓 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 healer_kx 的回复:]
引用 2 楼 loaden 的回复:
试过/MT和/MTd的区别了?
不懂汇编,只是感兴趣这个主题。


论坛有几个老邓啊?老邓不是懂汇编的吗?
[/Quote]
只会点皮毛。
/MD和/MDd都使用动态CRT库,没道理/MD比/MDd还慢。
检查下优化选项?
traceless 2010-01-04
  • 打赏
  • 举报
回复
如描叙那样编译上述代码,并执行,没有出现你所说的反差状况
wesleyluo 2010-01-04
  • 打赏
  • 举报
回复
编译器在处理debug 和release 时对代码的处理是不一样的。
traceless 2010-01-04
  • 打赏
  • 举报
回复
GetTickCount()

看到了使用这个,再看看代码

肯定会不一样了
tgh621 2010-01-04
  • 打赏
  • 举报
回复
恩 如果在release下把/MT改为/MTd 就和debug模式下一样快了
healer_kx 2010-01-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 loaden 的回复:]
试过/MT和/MTd的区别了?
不懂汇编,只是感兴趣这个主题。
[/Quote]

论坛有几个老邓啊?老邓不是懂汇编的吗?
healer_kx 2010-01-04
  • 打赏
  • 举报
回复
MARK
老邓 2010-01-04
  • 打赏
  • 举报
回复
试过/MT和/MTd的区别了?
不懂汇编,只是感兴趣这个主题。
tgh621 2010-01-04
  • 打赏
  • 举报
回复
我这边releas版本输出 328 297 547
而debug版本确是 172 297 250

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧