我知道ViewData和ViewBag都使用相同的后备数据,并且在大多数情况下都不如使用强类型模型那样好。但是,在两者之间进行选择时,ViewBag的动态特性比使用ViewData慢吗?
答案 0 :(得分:46)
好的 - 我最初的回答基本上是'不' - 时间稍微过了一点。
在一个完美的动态世界中 应该是'不' - 但仔细观察后,似乎没有任何区别(占JIT魔法)或可能虽然不足以保证不使用它(我当然是),但是它会慢慢变慢。
理论上如果正确实现,ViewBag最终将胜过ViewData字典的使用,因为表达式(例如ViewBag.Foo
)的绑定在不同的{{ViewBag
中得到很好的缓存。 3}}编译器将生成的(反映一个读取或写入public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = this.ViewData[binder.Name];
return true;
}
的方法,你会看到我的意思)。
DLR CallSite的缓存层(如果深入了解,有点难以理解)但基本上运行时尽力“记住”给定值实例一旦绑定它的位置 - 对于例如,通过Set或Get语句。
但是缓存,它的使用和有效性完全取决于类/接口的底层实现,例如are well documented,DynamicObject等;以及Get / Set表达式绑定的最终结果。
对于MVC内部的DynamicViewDataDictionary类 - 它最终会绑定到此:
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
的,而不是反过来,然后{{1}}已经实现了类似IDynamicMetaObjectProvider的内容,那么它可能是一个不同的故事 - 因为ExpandoObject
的动态实现更加智能,它采用的缓存规则允许一些非常酷的运行时优化。
(感谢Shawn McLean建议需要一个!)
ViewBag将比ViewData慢;但可能还不足以引起关注。
答案 1 :(得分:9)
我还没有做过任何测试,但我的直觉是,在现实世界的场景中,差异可以忽略不计。您可能会在每个页面上访问几次,并且几个CPU周期不会有任何区别。人们可以在其他地方找到更大的性能提升。