gpt4 book ai didi

asp.net-mvc - MVC 中的 ViewBag 与 ViewData 性能差异?

转载 作者:行者123 更新时间:2023-12-03 08:24:16 24 4
gpt4 key购买 nike

我知道 ViewData 和 ViewBag 都使用相同的支持数据,并且在大多数情况下都没有使用强类型模型好。然而,在两者之间进行选择时,ViewBag 的动态特性是否比使用 ViewData 慢?

最佳答案

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

在一个完美的动态世界中,它应该是“不”——但经过仔细检查,似乎没有区别(考虑到 JIT 魔法)或者它可能会稍微慢一些,尽管不足以保证不使用它(我当然是)。

理论上,如果实现得当,ViewBag 最终会胜过 ViewData 字典的使用,因为表达式的绑定(bind)(例如 ViewBag.Foo)在不同的 CallSite 之间得到了很好的缓存。 s 编译器将生成的(反射(reflect)一个对 ViewBag 进行读取或写入的方法,您会明白我的意思)。

DLR 的缓存层 are well documented (如果深入了解后有点难以理解)但基本上运行时会尽力“记住”给定值实例一旦绑定(bind)它的位置 - 例如通过 Set 或 Get 语句。

但是 缓存、其使用和有效性完全取决于类/接口(interface)的底层实现,例如 DynamicObject , IDynamicMetaObjectProvider ETC;以及 Get/Set 表达式绑定(bind)的最终结果。

在 MVC 内部 DynamicViewDataDictionary 类的情况下 - 它最终绑定(bind)到这个:

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;
换句话说 - 这些语句被有效地重写为字典索引器的包装器。

正因为如此,肯定没有办法比自己做更快。

ViewDataViewBag 为食,而不是相反,并且有 ViewBag然后用 ExpandoObject 之类的东西实现, 那么它可能是一个不同的故事 - 作为 ExpandoObject 的动态实现更加智能,并且它采用的缓存规则允许一些非常酷的运行时优化。

综上所述

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

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

关于asp.net-mvc - MVC 中的 ViewBag 与 ViewData 性能差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5078996/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com