ViewBag与MVC中的ViewData性能差异?

时间:2011-02-22 13:52:23

标签: asp.net-mvc performance asp.net-mvc-3 viewdata viewbag

我知道ViewData和ViewBag都使用相同的后备数据,并且在大多数情况下都不如使用强类型模型那样好。但是,在两者之间进行选择时,ViewBag的动态特性比使用ViewData慢吗?

2 个答案:

答案 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 documentedDynamicObject等;以及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

换句话说 - 这些语句实际上被重写为字典索引器周围的包装器。

正因为如此,当然没有办法比自己动手更快。

ViewBagViewBag的,而不是反过来,然后{{1}}已经实现了类似IDynamicMetaObjectProvider的内容,那么它可能是一个不同的故事 - 因为ExpandoObject的动态实现更加智能,它采用的缓存规则允许一些非常酷的运行时优化。

结论

(感谢Shawn McLean建议需要一个!)

ViewBag将比ViewData慢;但可能还不足以引起关注。

答案 1 :(得分:9)

我还没有做过任何测试,但我的直觉是,在现实世界的场景中,差异可以忽略不计。您可能会在每个页面上访问几次,并且几个CPU周期不会有任何区别。人们可以在其他地方找到更大的性能提升。