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
答案 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中的代码执行了阻塞操作