我有同样的问题。我更喜欢在我公司的代码中默认检查一段代码,因为溢出的副作用可能会花费很多并且难以诊断。发现这些副作用的真正原因可能非常有价值。
问题是,我们在性能方面失去了什么?
这是一个非常简单的长凳:
static void Main(string[] args)
{
long c = 0;
var sw = new Stopwatch();
sw.Start();
unchecked
{
for (long i = 0; i < 500000000; i++) c += 1;
}
sw.Stop();
Console.WriteLine("Unchecked: " + sw.ElapsedMilliseconds);
c = 0;
sw.Restart();
checked
{
for (long i = 0; i < 500000000; i++) c += 1;
}
sw.Stop();
Console.WriteLine("Checked: " + sw.ElapsedMilliseconds);
}
在生成的 IL 中,我看到checked和unchecked关键字决定了使用add.ovf还是add指令。(用于调试和发布配置)
IL_001c: ldloc.2
IL_001d: ldc.i4.1
IL_001e: conv.i8
IL_001f: add
IL_0066: ldloc.2
IL_0067: ldc.i4.1
IL_0068: conv.i8
IL_0069: add.ovf
结果(x64 主机)
调试
发布
将 long(s) 替换为 int(s) 的其他结果(x64 主机)
调试
发布
性能影响就在那里,看起来更重要的是选择正确的变量类型来检查或取消检查。无论如何,这不会改变我的看法。我将在我们所有的项目中打开“检查算术上溢/下溢”!(高级构建设置)。
当需要性能时,我会简单地使用未选中的块。