游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4453|回复: 3

这是小弟写的memset代替函数,与官方memset对比测试快了4

[复制链接]

45

主题

157

帖子

169

积分

注册会员

Rank: 2

积分
169
QQ
发表于 2009-4-28 22:32:00 | 显示全部楼层 |阅读模式
这是小弟写的memset代替函数,与官方memset对比测试快了4倍,大家可以测试哈看看:
_inline void memset32( void* p, unsigned char byValue, unsigned long ulDataSize )
{
        unsigned long ulValue = byValue
                                | ( ( unsigned long )byValue << 8 )
                                | ( ( unsigned long )byValue << 16 )
                                | ( ( unsigned long )byValue << 24 );
       
       
        unsigned long ulDwordSize = ulDataSize >> 2;
        unsigned long ulByteSize = ulDataSize - ( ulDwordSize << 2 );
       
        unsigned char* p1 = ( unsigned char* )( ( unsigned long )p + ( ulDwordSize << 2 ) );
               
        _asm
        {
                mov                edi, p;
                test    edi, edi         // p == 0?
                     jz      short toend     // if so, nothing to do
                mov                ecx, ulDwordSize;
                test    ecx, ecx         //ulDwordSize == 0?
                     jz      short toend     // if so, nothing to do
                mov                eax, ulValue;
                rep stosd;
       
                mov                edi, p1;
                test    edi, edi         // p1 == 0?
                     jz      short toend     // if so, nothing to do
                mov                edx, ulByteSize;
                test    edx,edx         // ulByteSize == 0?
                     jz      short toend     // if so, nothing to do
                mov                al, byValue;
        tail:
                mov     [edi],al        //set remaining bytes
                     add     edi,1
                     sub     edx,1           //if there is some more bytes
                     jnz     tail            //continue to fill them
        toend:
        }
}

这是测试填充65539字节的代码:
       float time0 = 0;
        float time1 = 0;
       
        int iForCount = 1;

        const long NUMBER = 65539;
        //unsigned char a[NUMBER];
        unsigned char* a = NULL;
        if( !New( &a, NUMBER ) )return false;
       
        time0 = TimeSystem.GetTime();
        for( int i = 0; i < iForCount; i++ )
        {       
                memset32( a, 255, NUMBER );
        }
        time1 = TimeSystem.GetTime();
        COUT<<T("新算法:")<<endl;
        COUT<<T("耗时: ")<<ValueFormatToStr( time1 - time0, -20, 10 )<<endl<<endl;

        time0 = TimeSystem.GetTime();
        for( i = 0; i < iForCount; i++ )
        {       
                ::memset( a, 255, NUMBER );               
        }
        time1 = TimeSystem.GetTime();
        COUT<<T("传统算法:")<<endl;
        COUT<<T("耗时: ")<<ValueFormatToStr( time1 - time0, -20, 10 )<<endl<<endl;

        ReleasePointer( a );
附上截图

2

主题

79

帖子

85

积分

注册会员

Rank: 2

积分
85
QQ
发表于 2009-4-29 09:32:00 | 显示全部楼层

Re: 这是小弟写的memset代替函数,与官方memset对比测试快了


   看下汇编的指令前缀rep的用法,please!

   不要忘了你的测试环境是否是多任务操作系统!!

3

主题

263

帖子

267

积分

中级会员

Rank: 3Rank: 3

积分
267
发表于 2009-4-30 13:27:00 | 显示全部楼层

Re:这是小弟写的memset代替函数,与官方memset对比测试快了

是在release下测试的么?
呵呵,我宁愿用C库函数..方便移植..

0

主题

14

帖子

14

积分

新手上路

Rank: 1

积分
14
发表于 2009-5-31 10:45:00 | 显示全部楼层

Re:这是小弟写的memset代替函数,与官方memset对比测试快了

请在同一条件下比较
别太得意了
不过 精神可嘉
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-20 04:36

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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