游戏开发论坛

 找回密码
 立即注册
搜索
楼主: flarez

ZeroMemory 和memset的速度谁快?

[复制链接]

3

主题

113

帖子

147

积分

注册会员

Rank: 2

积分
147
发表于 2007-7-23 09:02:00 | 显示全部楼层

Re: Re: Re:ZeroMemory 和memset的速度谁快?

kissorange: Re: Re:ZeroMemory 和memset的速度谁快?



    你这样看法是错误的。

    struct a = {0}; 如果你是在执行代码里加上这一句,实际上它是占用运...


谢谢,学到了. [em5]

44

主题

305

帖子

435

积分

中级会员

Rank: 3Rank: 3

积分
435
发表于 2007-7-23 16:59:00 | 显示全部楼层

Re:ZeroMemory 和memset的速度谁快?

memset和ZeroMemory,速度上到是差不多,建议不要用附值的办法

15

主题

368

帖子

406

积分

中级会员

Rank: 3Rank: 3

积分
406
发表于 2007-7-23 22:47:00 | 显示全部楼层

Re: Re: Re: Re:ZeroMemory 和memset的速度谁快?

duzhi5368: Re: Re: Re:ZeroMemory 和memset的速度谁快?



谢谢,学到了. [em5]


给你几段汇编代码看看
vc2003 sp1:
用memset的
int _tmain(int argc, _TCHAR* argv[])
{
00401000  push        ebp  
00401001  mov         ebp,esp
00401003  and         esp,0FFFFFFF8h
00401006  mov         eax,0C800Ch
0040100B  call        _chkstk (401090h)
00401010  mov         eax,dword ptr [___security_cookie (407030h)]
00401015  xor         eax,ebp
00401017  mov         dword ptr [esp+0C8008h],eax
0040101E  push        edi  
        char szBuff[1024*800];
        memset(szBuff, 0, sizeof(szBuff));
0040101F  xor         eax,eax
00401021  mov         ecx,32000h
00401026  lea         edi,[esp+8]
0040102A  rep stos    dword ptr [edi]
        return szBuff[1024*800-1];
}

不用memset的:
int _tmain(int argc, _TCHAR* argv[])
{
00401000  push        ebp  
00401001  mov         ebp,esp
00401003  and         esp,0FFFFFFF8h
00401006  mov         eax,0C800Ch
0040100B  call        _chkstk (401090h)
00401010  mov         eax,dword ptr [___security_cookie (407030h)]
00401015  xor         eax,ebp
00401017  mov         dword ptr [esp+0C8008h],eax
0040101E  push        edi  
        char szBuff[1024*800] = {0};
0040101F  xor         eax,eax
00401021  mov         ecx,31FFFh
00401026  lea         edi,[esp+9]
0040102A  rep stos    dword ptr [edi]
        return szBuff[1024*800-1];
}



VC2005 sp1:
不使用memset
00401005  call        _chkstk (401820h)
0040100A  mov         eax,dword ptr [___security_cookie (403000h)]
0040100F  xor         eax,esp
00401011  mov         dword ptr [esp+0C8000h],eax
    char szBuff[1024*800] = {0};
00401018  push        0C7FFFh
0040101D  lea         eax,[esp+5]
00401021  push        0   
00401023  push        eax  
00401024  call        memset (40184Ch)
        return szBuff[1024*800-1];

使用memset
00401005  call        _chkstk (401820h)
0040100A  mov         eax,dword ptr [___security_cookie (403000h)]
0040100F  xor         eax,esp
00401011  mov         dword ptr [esp+0C8000h],eax
    char szBuff[1024*800];
    memset(szBuff, 0, sizeof(szBuff));
00401018  push        0C8000h
0040101D  lea         eax,[esp+4]
00401021  push        0   
00401023  push        eax  
00401024  call        memset (40184Ch)
        return szBuff[1024*800-1];
}


有没有发现什么?
看你的回答,很无语啊。。。

103

主题

1432

帖子

1458

积分

金牌会员

Rank: 6Rank: 6

积分
1458
QQ
发表于 2007-7-23 23:37:00 | 显示全部楼层

Re:ZeroMemory 和memset的速度谁快?


简单就是美~~

能用语言搞定,用语言
能用标准库搞定,用标准库
在不行,尽量自己写或使用别人的库
最后才调用平台api

0

主题

61

帖子

61

积分

注册会员

Rank: 2

积分
61
发表于 2007-7-24 02:05:00 | 显示全部楼层

Re: Re: Re: Re: Re:ZeroMemory 和memset的速度谁快?

yukun84: Re: Re: Re: Re:ZeroMemory 和memset的速度谁快?



给你几段汇编代码看看
vc2003 sp1:
用memset的
int _tmain(int argc, _TCHAR* argv[])
{
00401000...


不要把DEBUG代码当Release代码读,OK?

15

主题

368

帖子

406

积分

中级会员

Rank: 3Rank: 3

积分
406
发表于 2007-7-24 18:52:00 | 显示全部楼层

Re: Re: Re: Re: Re: Re:ZeroMemory 和memset的速度谁快?

wuwenye: Re: Re: Re: Re: Re:ZeroMemory 和memset的速度谁快?



不要把DEBUG代码当Release代码读,OK?

噢?我贴的是debug?是我的编译器出问题了吗?
那能不能把你的release代码贴出来看看?

0

主题

3

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2007-7-25 14:32:00 | 显示全部楼层

Re:ZeroMemory 和memset的速度谁快?

vc2003以后编译器的自动优化已经很强了,={0}这种写法的初始化编译器都可以搞定成 memset 调用的。

顺带说一句,2005之所以没有展开成内联汇编是因为2005的memset内部会判断3个条件:
1.是否0填充
2.填充长度是否大于0x100
3.机器是否支持sse2
如果满足这3个条件就会转向调用sse2的快速填充算法

0

主题

26

帖子

26

积分

注册会员

Rank: 2

积分
26
发表于 2007-8-12 15:00:00 | 显示全部楼层

Re:ZeroMemory 和memset的速度谁快?

呵呵

0

主题

1

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2010-6-16 05:09:00 | 显示全部楼层

Re: Re: Re:ZeroMemory 和memset的速度谁快?

kissorange: Re: Re:ZeroMemory 和memset的速度谁快?



    你这样看法是错误的。

    struct a = {0}; 如果你是在执行代码里加上这一句,实际上它是占用运...



真是无语了,GameRes果然是个神奇的地方。 memset居然被认为是编译器清0……
不知道洗屁屁(CPP)是什么个情况,在C语言中是这样的:
struct{....}name={0};
这样的才是编译期清0,运行时入栈的时候已经是0了。当然,第二次这样赋值的时候就变成普通赋值了,但绝对没有你说的那种按位清0。你觉得编译器会有那么傻吗?编译器的优化能力还是很不错的。
memset和memcpy一样,在编译时会选择最合适的方法,长度较短的时候会直接用mov

227

主题

1794

帖子

1866

积分

金牌会员

Rank: 6Rank: 6

积分
1866
发表于 2010-6-16 16:37:00 | 显示全部楼层

Re: Re:ZeroMemory 和memset的速度谁快?

yukun84: Re:ZeroMemory 和memset的速度谁快?
巨讨厌没事也要用WINAPI函数的家伙。在一个工程里,别人都写memset和memcpy,有人就偏要在里面写ZeroMemory和CopyMemory,我看到就恼火。

你这让我们api党情何以堪
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-8 16:32

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表