Я создал два метода, один обернутый checked
, а другой * unchecked
.Если посмотреть на IL, единственное отличие - это операция mul
(которая выполняет операцию умножения), для проверенного генерируется mul.ovf
, а для непроверенного - mul
.
Подводя итог, я считаю, что разница в одной операции ЦП не влияет на производительность, единственное отличие будет в случае переполнения при использовании checked
- в этом случае будет сгенерировано OverflowException, которое, очевидно, медленнозавершение выполнения.
MSDN:
Следующие инструкции Microsoft на промежуточном языке (MSIL) генерируют исключение OverflowException:
[Test]
public void Checked()
{
checked
{
int i = int.MaxValue;
i = i * 100;
Debug.WriteLine(i);
}
}
[Test]
public void UnChecked()
{
unchecked
{
int i = int.MaxValue;
i = i * 100;
Debug.WriteLine(i);
}
}
И затем с помощью ILDASM см. IL:
CHECKED ():
// Code size 27 (0x1b)
.maxstack 2
.locals init ([0] int32 i)
IL_0000: nop
IL_0001: nop
IL_0002: ldc.i4 0x7fffffff
IL_0007: stloc.0
IL_0008: ldloc.0
IL_0009: ldc.i4.s 100
**IL_000b: mul.ovf** !!!
IL_000c: stloc.0
IL_000d: ldloc.0
IL_000e: box [mscorlib]System.Int32
IL_0013: call void [System]System.Diagnostics.Debug::WriteLine ...
НЕПРОВЕРЕНО ():
// Code size 27 (0x1b)
.maxstack 2
.locals init ([0] int32 i)
IL_0000: nop
IL_0001: nop
IL_0002: ldc.i4 0x7fffffff
IL_0007: stloc.0
IL_0008: ldloc.0
IL_0009: ldc.i4.s 100
**IL_000b: mul** !!!
IL_000c: stloc.0
IL_000d: ldloc.0
IL_000e: box [mscorlib]System.Int32
IL_0013: call void [System]System.Diagnostics.Debug::WriteLine(...)