Asp.net-Mvc

MVC 中的 ViewBag 與 ViewData 性能差異?

  • February 22, 2011

我知道 ViewData 和 ViewBag 都使用相同的支持數據,並且在大多數情況下都沒有使用強類型模型好。然而,在兩者之間進行選擇時,ViewBag 的動態特性是否比使用 ViewData 慢?

好的——我最初的回答基本上是“不”——是時候掉頭了。

在一個完美的動態世界中,它應該是“不”——但經過仔細檢查,看起來要麼沒有區別(考慮到 JIT 魔法),要麼它可能會稍微慢一些,儘管不足以保證不使用它(我當然是)。

理論上*,如果正確實現*,ViewBag 最終會勝過 ViewData 字典的使用,因為表達式的綁定(例如ViewBag.Foo)在編譯器將生成的不同CallSite中很好地記憶體(反映了執行讀取或寫入的方法你會ViewBag明白我的意思)。

DLR 的記憶體層有據可查(如果深入了解後有點難以理解),但基本上執行時會盡力“記住”給定值實例一旦綁定它的位置 - 例如通過 Set 或得到聲明。

但是記憶體、它的使用和有效性完全取決於類/介面的底層實現,例如DynamicObjectIDynamicMetaObjectProvider等;以及 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 慢;但可能不足以引起關注。

引用自:https://stackoverflow.com/questions/5078996