Почему кастинг быстрее, чем отражение в .NET?

У меня есть обработчик событий, который должен определить тип и выполнить код, если он соответствует определенному типу. Первоначально мы передали его объекту, и если он был не null, мы выполнили код, чтобы ускорить его, я использовал отражение, и это фактически замедлило его, и я не понимаю, почему.

вот пример кода

Trace.Write("Starting using Reflection");
if (e.Item.GetType() == typeof(GridDataItem))
{
      bool isWatch = Convert.ToBoolean(e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["IsWatch"]);
      if (isWatch)
      {
          e.Item.Style["Font-Weight"] = "bold";
      }
 }
 Trace.Write("Ending using Reflection");
 Trace.Write("Starting using Cast");
 GridDataItem gridItem = e.Item as GridDataItem;
 if (gridItem !=null)
 {
     bool isWatch = Convert.ToBoolean(gridItem.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["IsWatch"]);
     if (isWatch)
     {
         gridItem.Style["Font-Weight"] = "bold";
     }
  }
  Trace.Write("Ending using Cast"); 

И это вывод трассировки, который я получаю

Starting using Reflection  0.79137944962406 0.576538
Ending using Reflection    0.791600842105263    0.000221
Starting using Cast    0.791623353383459    0.000023
Ending using Cast      0.791649308270677    0.000026
Starting using Reflection  0.876253801503759    0.084604
Ending using Reflection    0.87631790075188 0.000064
Starting using Cast    0.87633445112782 0.000017
Ending using Cast      0.87634950075188 0.000015

это не так много, но если нам пришлось сделать это со временем, это может сложить.

Ответ 1

Отражение происходит медленно, потому что вы запрашиваете метаданные сборки, тогда как casting просто изменяет тип объекта, на который вы ссылаетесь.

Метаданные сборки являются полезным хранилищем информации, но эта информация лучше всего использовать во время компиляции, а не во время выполнения. Эти метаданные используются компилятором для проверки статического типа (среди прочего). Вы используете те же самые метаданные для поиска информации о типе во время выполнения (это нормально, если у вас нет другого выбора), который значительно медленнее, чем кастинг.

Ответ 2

Отражение должно проходить во время выполнения и определять, какие свойства и т.д. объект имеет во время выполнения. Кастинг сообщает приложению, что он должен ожидать, что объект имеет свойства X и должен функционировать определенным образом.

Ответ 3

Кастинг сообщает, что среда выполнения "знает" тип конкретного объекта. Хотя вы, возможно, ошибаетесь, среда исполнения полагает, что вы не выполняете дополнительное время, необходимое для проверки метаданных сборки.

Ответ 4

Почему вы не используете оператор? Я думаю, что это более читаемо, поскольку у вас нет явного приведения, а затем проверьте. Он просто проверяет, что переменная имеет правильный тип.

if (e.Item is GridDataItem)
{
    bool isWatch = Convert.ToBoolean(e.Item.OwnerTableView.DataKeyValues[e.Item.ItemIndex]["IsWatch"]);
    if (isWatch)
    {
        e.Item.Style["Font-Weight"] = "bold";
    }
}

Ответ 5

Каста могут выполняться как целочисленные сравнения во время выполнения, но отражение включает в себя полные вызовы методов.

Ответ 6

Хорошо, что короткий ответ на лучшую часть практики никогда не будет использовать отражение, если вы можете получить тот же результат с обычным кодом.

При оптимизации кода обычно это хорошая идея для оценки того, когда оптимизация времени будет приводить к наибольшему выигрышу в производительности. переопределение операторов изначально на языке редко будет в верхней части этого списка