Я знаю, что ViewData и ViewBag используют одни и те же данные поддержки, и в большинстве случаев они не так хороши, как использование сильно типизированных моделей. Однако при выборе между ними динамический характер ViewBag медленнее, чем использование ViewData?
ViewBag vs ViewData разница в производительности MVC?
Ответ 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
Я не пробовал никаких тестов, но, по моему мнению, в реальных сценариях разница просто незначительна. Вы, вероятно, получите доступ к нему несколько раз на каждой странице, и несколько циклов процессора не будут иметь никакого значения. В других местах можно добиться большего улучшения производительности.