jit是否优化了读取的字节?

时间:2019-02-18 03:34:45

标签: c# jit

    public char GetChar(ref char* c)
    {
        var cc = *c;
        ++c;
        return cc;
    }
    public int GetInt(ref char* c)
    {
        var cc = *(int*)c;
        c += 2;
        return cc;
    }
    ------------------------------------------
    public bool A(char* c)
    {
        return this.GetChar(ref c) == 'N' && this.GetChar(ref c) == 'a' && this.GetChar(ref c) == 'a';
    }
    public bool B(char* c)
    {
        //In this machine, "aa"==6357089
        return this.GetChar(ref c) == 'N' && this.GetInt(ref c) == 6357089 ;
    }
    -------------------------------------------
    Performance test:
       string str="Naa";
       for(3000000)
          A(str)
       for(3000000)
          B(str)

我有一个字符串,我想读它。我将其从两个字节的char转换为四个字节的int以加快速度。

在Debug模式下,方法B的速度明显快于方法A的速度。但是在Release模式下,方法A的速度比方法B的速度快0.5倍。

我在两种模式下检查了IL代码,差异很小。那么JIT的优化是否导致方法A比方法B更快?

如何在这里优化jit?

补充:C#,x64,.net 4.7

2 个答案:

答案 0 :(得分:0)

看看程序集,GetChar尚未优化,所以我认为您的测试代码可能有问题。

方法A

//this.GetChar(ref c) == 'N'
4E5  mov         rax,qword ptr [rsp+10h]  
4EA  movzx       eax,word ptr [rax]  
4ED  lea         rdx,[rsp+10h]  
4F2  add         qword ptr [rdx],2  
4F6  cmp         eax,4Eh  
4F9  jne         52C  
//this.GetChar(ref c) == 'a'
4FB  mov         rax,qword ptr [rsp+10h]  
500  movzx       eax,word ptr [rax]  
503  lea         rdx,[rsp+10h]  
508  add         qword ptr [rdx],2  
50C  cmp         eax,61h  
50F  jne         52C  
//this.GetChar(ref c) == 'a'
511  mov         rax,qword ptr [rsp+10h]  
516  movzx       eax,word ptr [rax]  
519  lea         rdx,[rsp+10h]  
51E  add         qword ptr [rdx],2  
522  cmp         eax,61h  
525  sete        al  
528  movzx       eax,al  
52B  ret  
52C  xor         eax,eax  

方法B

//this.GetChar(ref c) == 'N'
545  mov         rax,qword ptr [rsp+10h]  
54A  movzx       eax,word ptr [rax]  
54D  lea         rdx,[rsp+10h]  
552  add         qword ptr [rdx],2  
556  cmp         eax,4Eh  
559  jne         577
//this.GetInt(ref c) == 6357089
55B  mov         rax,qword ptr [rsp+10h]  
560  mov         eax,dword ptr [rax]  
562  lea         rdx,[rsp+10h]  
567  add         qword ptr [rdx],4  
56B  cmp         eax,610061h  
570  sete        al  
573  movzx       eax,al  
576  ret  
577  xor         eax,eax  

答案 1 :(得分:0)

通过进一步的测试,我发现在发布或调试的情况下,对于x64环境,方法A接近方法B。

在X32环境中,方法A慢于方法B。似乎在x64下,jit对函数A中的代码执行了阻塞操作