快速内存比较函数CompareMem(Delphi SSE优化算法应用之二)

本文介绍了一个使用汇编语言实现的快速内存比较算法,该算法利用SSE指令集进行内存块对比,相较于传统算法能提高60%-110%的速度。

 

function CGCompareMem(P1, P2: Pointer; Length: Integer): Integer; assembler;
asm
        PUSH    ESI
        PUSH    EDI
        PUSH    ECX
        PUSH    EBX
        MOV     ESI,P1
        MOV     EDI,P2
        CMP     ESI,EDI
        JZ      @Equal
        CMP     ECX,1 
        JL      @NotEqual
        MOV     edx,ecx
        shr     edx, 4 
        and     ecx, 15 
        test    ecx,ecx
        JZ      @SSECMP2
        mov     eax,-16
        sub     esi,eax
        sub     edi,eax
@CompareLoop:
        mov     ebx, [ESI + Eax]
        xor     ebx, [EDI + Eax]
        jnz     @Mismatch
        add     Eax, 4
        js      @CompareLoop
        JMP     @SSECMP
@Mismatch:
        bsf      ebx, ebx
        shr      ebx, 3
        sub      eax,-16
        add      eax,ebx
        add      eax,1
        JMP      @EXIT
@SSECMP:
        sub     esi,16
        sub     edi,16
@SSECMP2:
        TEST    edx,edx
        JZ      @EXIT
        mov     eax,ecx
        neg     edx
        pxor    xmm2,xmm2
@SSECMPLOOP:
        movups  xmm0,[ESI + Eax]
        movups  xmm1,[EDI + Eax]
        pxor    xmm0,  xmm1
        pcmpeqb  xmm0, xmm2
        pmovmskb ebx, xmm0
        CMP     ebx,$FFFF
        jnz     @SSEMismatch
        add     eax,16
        inc     edx
        js      @SSECMPLOOP
        xor     eax,eax
        JMP     @EXIT

@SSEMismatch:
        mov     ebx, [ESI + Eax]
        xor     ebx, [EDI + Eax]
        jnz     @Mismatch2
        add     Eax, 4
        jmp     @SSEMismatch
@Mismatch2:
       bsf      ebx, ebx
       shr      ebx, 3
       add      eax,ebx
       add      eax,1
       JMP     @EXIT
@NotEqual:
        MOV     EAX,-1
        JMP     @EXIT
@Equal:
        XOR     EAX,EAX
@EXIT:
        POP     EBX
        POP     ECX
        POP     EDI
        POP     ESI
end;

经测试比常规算法快60%-110%

高管动态:Stkcd [证券代码] - 以交易所公布的证券代码为准。Reptdt [统计截止日期] - 以YYYY-MM-DD列示,部分缺少在相应位置上以00表示,如1993年12月某日表示为1993-12-00。基本情况统计的截止日期D0101b [姓名] - 上市公司董事、监事、高级管理人员的姓名。D0201a [职务类别] - 10位编码。一至二位标识董事会监事会任职情况,10=董事(常务、代理等),11=董事长(副),12=独立董事,13=董事局主席(副),14=其他;20=监事(副),21=监事会主席(副),22=职工监事,23=其他三至六位表示高级管理层任职情况,30=总经理(副),31=经理(副),32=总裁(副),33=董秘,34=负责人,35=主管(副),36=顾问,37=CEO,38=总监,39=其他;七至八位表示企业任职情况,40=部长(副),41=局长(副),42=处长(副),43=主任(副),44=书记(副),45=工会主席(副),46=其他;最后两位表示具体管理方向,A=财务,B=工程,C=技术,D=信息,E=法律,F=人力资源,G=市场,H=运营,I=行政,J=投资,K=生产,L=质量,M=其他,N=无具体管理方向空位用“0”表示例如:董事、副总经理、总会计师、董事会秘书表示为10303300AND0201b [具体职务] - 具体职位名称。D0301b [性别] - D0401b [年龄] - -9666=未披露。D0501b [教育背景] - 1=中专及中专以下,2=大专,3=本科,4=硕士研究生,5=博士研究生,6=其他(以其他形式公布的学历,具体见该记录的备注)。D0601b [职称] - 未披露用N/A表示D0701b [现职任职开始日期] - 以YYYY-MM-DD列示,部分缺少在相应位置上以00表示,如1993年12月某日表示为1993-12-00。D0702b [现职任职结束日期] - 以YYYY-MM-DD列示,部分缺少在相应位置上以00表示,如1993年12月某日表示为1993-12-00。D0801c [高管个人简历] - D1301b [备注] - 特殊情况备份。D0901b [是否领取薪酬] - 是否在上市公司领取薪酬(如果在上市公司只领取津贴,则视为2处理)1=在上市公司领取薪酬,2=未在上市公司领取薪酬。D1001b [报告期报酬总额] - 未披露用-9666表示D1002b [其中:津贴] - 未披露用-9666表示D1101b [年末持股数] - 未披露用-9666表示D1201b [其他单位兼任标识] - 是否在除上市公司外的其他单位有兼任职务。1=有兼任,2=无兼任。当该字段等于1时,表十有意义。此字段从2005年开始,以前年度无意义用0表示。股东持股:Stkcd [证券代码] - 以交易所公布的证券代码为准。Reptdt [统计截止日期] - 以YYYY-MM-DD列示,部分缺少在相应位置上以00表示,如1993年12月某日表示为1993-12-00。基本情况统计的截止日期S0101b [股东名称] - 上市公司所披露的股东名称。S0201b [持股数量] - 未披露用-9666表示S0301b [持股比例(%)] - 未披露用-9666表示S0401b [股份性质] - 未披露用N/A表示S0601b [备注] - 为2001年数据更新时新增字段S0501b [持股排名] - 该股东在10大股东内排名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值