MVC 中的 ViewBag 與 ViewData 性能差異?
我知道 ViewData 和 ViewBag 都使用相同的支持數據,並且在大多數情況下都沒有使用強類型模型好。然而,在兩者之間進行選擇時,ViewBag 的動態特性是否比使用 ViewData 慢?
好的——我最初的回答基本上是“不”——是時候掉頭了。
在一個完美的動態世界中,它應該是“不”——但經過仔細檢查,看起來要麼沒有區別(考慮到 JIT 魔法),要麼它可能會稍微慢一些,儘管不足以保證不使用它(我當然是)。
理論上*,如果正確實現*,ViewBag 最終會勝過 ViewData 字典的使用,因為表達式的綁定(例如
ViewBag.Foo)在編譯器將生成的不同CallSite中很好地記憶體(反映了執行讀取或寫入的方法你會ViewBag明白我的意思)。DLR 的記憶體層有據可查(如果深入了解後有點難以理解),但基本上執行時會盡力“記住”給定值實例一旦綁定它的位置 - 例如通過 Set 或得到聲明。
但是記憶體、它的使用和有效性完全取決於類/介面的底層實現,例如DynamicObject、IDynamicMetaObjectProvider等;以及 Get/Set 表達式綁定的最終結果。
在 MVC 內部 DynamicViewDataDictionary 類的情況下 - 它最終綁定到這個:
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更加智能,並且它採用的記憶體規則允許一些漂亮的很酷的執行時優化。綜上所述
(感謝 Shawn McLean 建議需要一個!)
ViewBag 會比 ViewData 慢;但可能不足以引起關注。