Почему медленнее сравнивать тип значения, допускающий значение NULL, с NULL в универсальном методе без ограничений?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Почему медленнее сравнивать тип значения, допускающий значение NULL, с NULL в универсальном методе без ограничений?

Сообщение Anonymous »

Я столкнулся с очень забавной ситуацией, когда сравнение типа, допускающего значение NULL, с типом NULL внутри универсального метода происходит в 234 раза медленнее, чем сравнение типа значения или ссылочного типа. Код следующий:

Код: Выделить всё

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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»