Код: Выделить всё
static bool IsNull(T instance)
{
return instance == null;
}
Код: Выделить всё
int? a = 0;
string b = "A";
int c = 0;
var watch = Stopwatch.StartNew();
for (int i = 0; i < 1000000; i++)
{
var r1 = IsNull(a);
}
Console.WriteLine(watch.Elapsed.ToString());
watch.Restart();
for (int i = 0; i < 1000000; i++)
{
var r2 = IsNull(b);
}
Console.WriteLine(watch.Elapsed.ToString());
watch.Restart();
for (int i = 0; i < 1000000; i++)
{
var r3 = IsNull(c);
}
watch.Stop();
Console.WriteLine(watch.Elapsed.ToString());
Console.ReadKey();
00:00:00.1879827
00:00:00.0008779
00:00:00.0008532
Как вы Как видите, сравнение целого числа, допускающего значение NULL, с нулевым значением происходит в 234 раза медленнее, чем сравнение целого числа или строки. Если я добавлю вторую перегрузку с правильными ограничениями, результаты резко изменятся:
Код: Выделить всё
static bool IsNull(T? instance) where T : struct
{
return instance == null;
}
00:00:00.0006040
00:00:00.0006017
00:00:00.0006014
Почему? Я не проверял байт-код, потому что не владею им свободно, но даже если бы байт-код был немного другим, я бы ожидал, что JIT оптимизирует это, но это не так (я работаю с оптимизацией) .
Подробнее здесь: https://stackoverflow.com/questions/570 ... -method-wi