Var
  string strTest;
...If CompareStr(strTest, 'abc')=0 Then
...If strTest='abc' Then//哪个比较有效率些?

解决方案 »

  1.   

    我想是CompareStr快function CompareStr(const S1, S2: string): Integer; assembler;
    asm
            PUSH    ESI
            PUSH    EDI
            MOV     ESI,EAX
            MOV     EDI,EDX
            OR      EAX,EAX
            JE      @@1
            MOV     EAX,[EAX-4]
    @@1:    OR      EDX,EDX
            JE      @@2
            MOV     EDX,[EDX-4]
    @@2:    MOV     ECX,EAX
            CMP     ECX,EDX
            JBE     @@3
            MOV     ECX,EDX
    @@3:    CMP     ECX,ECX
            REPE    CMPSB
            JE      @@4
            MOVZX   EAX,BYTE PTR [ESI-1]
            MOVZX   EDX,BYTE PTR [EDI-1]
    @@4:    SUB     EAX,EDX
            POP     EDI
            POP     ESI
    end;
      

  2.   

    我个人也认为是 CompareStr 快......
      

  3.   

    这个汇编码Who给解释解释?!
      

  4.   

    晕,comparestr的代码全是汇编的啊
      

  5.   

    asm
            PUSH    ESI ,ESI压入堆栈指针寄存器
            PUSH    EDI ,same
            MOV     ESI,EAX  ,将EAX的内容复制到入ESI
            MOV     EDI,EDX  ,same
            OR      EAX,EAX  ,不懂
            JE      @@1      ,jump?
            MOV     EAX,[EAX-4]
    @@1:    OR      EDX,EDX
            JE      @@2
            MOV     EDX,[EDX-4]
    @@2:    MOV     ECX,EAX
            CMP     ECX,EDX ,比较
            JBE     @@3
            MOV     ECX,EDX
    @@3:    CMP     ECX,ECX
            REPE    CMPSB ,不懂
            JE      @@4
            MOVZX   EAX,BYTE PTR [ESI-1] ,不懂
            MOVZX   EDX,BYTE PTR [EDI-1]
    @@4:    SUB     EAX,EDX
            POP     EDI  ,出栈
            POP     ESI
    end;
    我才学汇编,请高手纠正和继续解释
      

  6.   

    OR      EAX,EAX  ,EAX是否为0 (空字符串)
    JE      @@1      ,为0则跳转(ZF=1)
     MOV     EAX,[EAX-4]//取S1长度到EAX
      

  7.   

    function CompareStr(const S1, S2: string): Integer; assembler;
    asm
            PUSH    ESI        //ESI压栈
            PUSH    EDI        //EDI压栈
            MOV     ESI,EAX
            MOV     EDI,EDX
    //========= 取S1长度到EAX =====================
            OR      EAX,EAX    //EAX是否为0 (空字符串)
            JE      @@1        //为0则跳转(ZF=1)
            MOV     EAX,[EAX-4]//取S1长度到EAX
    //========= 取S2长度到EDX =====================
    @@1:    OR      EDX,EDX    //EDX是否为0
            JE      @@2        //为0则跳转(ZF=1)
            MOV     EDX,[EDX-4]//取S2长度到EDX
    //========= ECX存放最小长度 =====================
    @@2:    MOV     ECX,EAX
            CMP     ECX,EDX   //比较ECX,EDX
            JBE     @@3       //小于等于则跳转(CF=1 or ZF=1)
            MOV     ECX,EDX   //ECX存放最小长度
    //========= 开始比较 =====================
    @@3:    CMP     ECX,ECX   //ZF:=1 ??        CLD   //DF:=0 need?
            REPE    CMPSB     //相等则重复取
            JE      @@4       //CX计数用完了仍然相等
            MOVZX   EAX,BYTE PTR [ESI-1] //= xor EAX, EAX ;  MOV EAX,BYTE PTR [ESI-1] 清0以后MOV //源串的当前字符进EAX
            MOVZX   EDX,BYTE PTR [EDI-1] //目标串的当前字符进EDX
    @@4:    SUB     EAX,EDX   //如果字符串前面都相同的话返回长度差,否则返回第一个不同的字符的差
            POP     EDI  //EDI出栈
            POP     ESI  //ESI出栈
    end;这个是对齐的问题..如果数据采用的是对齐的方式的话是有利于计算机加快处理的.
      

  8.   


    String类型在内存中的确切格式如下:
    (4字节)分配大小+(4字节)引用计数+(4字节)字串长度+(不定长)字符数组+(1字节)$0结束字符
      

  9.   

    偶然中偶又看见了CompareText这么一个函数,才发现CompareStr是区分大小写的。按照一般的想法那是CompareText由比CompareStr快了吧,但是'='号是否区分大小写的呢?