使用未经检查的上下文是否会损害C#中的性能或可移植性?

sha*_*oth 8 .net c# performance portability unchecked

我想实现一个快速哈希函数,它将使用int数据类型并依赖于整数溢出.MSDN说,为了保证溢出不会触发异常,我必须unchecked为该代码使用块.

假设我只在unchecked块中包围该计算.我的代码会因此而出现任何性能或可移植性问题吗?

GLe*_*aTi 9

选中只添加一条进程指令:

checked
{
    int y = x * x;
05297978  mov         eax,dword ptr [ebp-10h]  
0529797B  imul        eax,dword ptr [ebp-10h]  
0529797F  jno         05297986  //if not overflow: goto 05297986
05297981  call        72A29522  //invoke exception
05297986  mov         dword ptr [ebp-14h],eax  
}

unchecked
{
    int yy = xx * xx;
0529799E  mov         eax,dword ptr [ebp-18h]  
052979A1  imul        eax,dword ptr [ebp-18h]  
052979A5  mov         dword ptr [ebp-1Ch],eax  
}
Run Code Online (Sandbox Code Playgroud)


xan*_*tos 8

从技术上讲,只有checked块应该减慢.所以我不认为一个unchecked块(框架必须做少量检查的块)可能会变慢.它不是上下文切换或类似的东西.JIT根本不发出检查溢出/下溢的指令.现在,显然如果有人创建了一个"特殊"处理器,其中必须模拟溢出并将Mono移植到其上,或者溢出导致与英特尔处理器不同的结果,则unchecked块会更慢(因为JIT必须"模拟"它).但请注意,.NET的基本类型是在ECMA标准中定义的.有符号的整数必须基于双补码,并且它们的大小必须是8,16,32,64位.使用36位整数的 "奇怪"处理器没有太多空间.


Jon*_*nna 8

作为一项规则,你可以期望未经检查的算术稍微快一点,但它几乎不值得向你提出相反的问题(即"将使用检查会伤害我的表现吗?").

checked和unchecked仅仅意味着有略微不同的规则如何像运营商+,*以及-被处理,你应该使用一个适合在手的情况下.

在这种情况下,您肯定希望取消选中,因此您应该在代码中说明这一点.这实际上增加了可移植性,因为无论编译器开关如何使用它都将具有相同的行为.