Подтвердить что ты не робот

ViewBag vs ViewData разница в производительности MVC?

Я знаю, что ViewData и ViewBag используют одни и те же данные поддержки, и в большинстве случаев они не так хороши, как использование сильно типизированных моделей. Однако при выборе между ними динамический характер ViewBag медленнее, чем использование ViewData?

4b9b3361

Ответ 1

Хорошо - мой первоначальный ответ в основном сказал "нет" - время для разворота.

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

В теории, если правильно реализовано, ViewBag в конечном итоге превзойдет использование словаря ViewData, потому что привязка выражений (например, ViewBag.Foo) очень хорошо кэшируется через разные CallSite, что компилятор будет генерировать (отразить метод, который читает или записывает в ViewBag, и вы увидите, что я имею в виду).

Уровни кэширования DLR хорошо документированы (если вам трудно понять, как только вы углубитесь), но в основном время выполнения делает лучше всего "помнить", где данный экземпляр значения после его привязки - например, через оператор Set или Get.

НО Кэширование, его использование и эффективность полностью зависят от базовых реализаций классов/интерфейсов, таких как DynamicObject, IDynamicMetaObjectProvider и т.д.; а также конечный результат привязки выражения Get/Set.

В случае внутреннего класса DynamicViewDataDictionary MVC - в конечном итоге он привязывается к этому:

public override bool TryGetMember(GetMemberBinder binder, out object result)
{
  result = this.ViewData[binder.Name];
  return true;
}

Для var a = ViewBag.Foo

и

public override bool TrySetMember(SetMemberBinder binder, object value)
{
  this.ViewData[binder.Name] = value;
  return true;
}

Для ViewBag.Foo = Bar;

Другими словами - операторы эффективно переписываются в обертки вокруг индексатора словарей.

Из-за этого, конечно, никак не могло быть быстрее, чем делать это самостоятельно.

Было ViewData для ViewBag, а не наоборот, и ViewBag было реализовано с помощью чего-то вроде ExpandoObject, тогда это может быть другая история - поскольку динамическая реализация ExpandoObject намного более интеллектуальна и правила кэширования он использует некоторые довольно крутые оптимизации времени исполнения.

В заключении

(спасибо Шон Маклин за то, что он предложил, чтобы это было необходимо!)

ViewBag будет медленнее, чем ViewData; но, вероятно, недостаточно для того, чтобы оправдать беспокойство.

Ответ 2

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