asp.net-mvc - mvc - viewbag no existe en el contexto actual
ViewBag vs ViewData diferencia de rendimiento en MVC? (2)
Sé que ViewData y ViewBag usan los mismos datos de respaldo y que ninguno de los dos es tan bueno como usar modelos muy tipados en la mayoría de los casos. Sin embargo, al elegir entre los dos, ¿la naturaleza dinámica de ViewBag es más lenta que con ViewData?
De acuerdo - mi respuesta inicial básicamente decía ''no'' - es hora de darles la vuelta.
Debería ser "no" en un mundo dinámico perfecto, pero luego de una inspección más cercana parecería que no habrá ninguna diferencia (lo que explica la magia de JIT) o podría ser cada vez más lento, aunque no lo suficiente como para justificar el no uso es (ciertamente lo soy)
En teoría, si se implementa correctamente , la ViewBag finalmente superará el uso del diccionario ViewData porque la vinculación de las expresiones (por ejemplo, ViewBag.Foo
) está muy bien almacenada en caché en los diferentes CallSite que el compilador generará (reflejar un método que hace una lee o escribe en ViewBag
y verás lo que quiero decir).
Las capas de almacenamiento en caché del DLR están bien documentadas (aunque un poco difíciles de entender una vez que se profundiza) pero básicamente el tiempo de ejecución hace lo posible para ''recordar'' dónde una instancia de valor determinado está ligada, por ejemplo, a través de un conjunto o Obtener una declaración.
PERO El almacenamiento en caché, su uso y efectividad dependen completamente de las implementaciones subyacentes de clases / interfaces tales como DynamicObject , IDynamicMetaObjectProvider , etc; así como también el resultado final del enlace de expresión Get / Set.
En el caso de la clase DynamicViewDataDictionary interna de MVC, finalmente termina siendo vinculante para esto:
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
result = this.ViewData[binder.Name];
return true;
}
Para var a = ViewBag.Foo
Y
public override bool TrySetMember(SetMemberBinder binder, object value)
{
this.ViewData[binder.Name] = value;
return true;
}
Para ViewBag.Foo = Bar;
En otras palabras, las declaraciones se están reescribiendo de manera efectiva en envoltorios alrededor del indexador de diccionario.
Por eso, ciertamente no hay forma de que sea más rápido que hacerlo tú mismo.
Si ViewData
alimentara de ViewBag
, en lugar de que se ViewBag
se haya implementado con algo como ExpandoObject
, entonces podría ser una historia diferente, ya que la implementación dinámica de ExpandoObject
es mucho más inteligente y el caché lo rige. emplea permiten algunas optimizaciones de tiempo de ejecución muy interesantes.
En conclusión
(¡Gracias a Shawn McLean por sugerir que se necesitaba uno!)
ViewBag será más lento que ViewData; pero probablemente no lo suficiente como para preocuparse.
No he hecho ninguna prueba, pero mi intuición es que en escenarios del mundo real, la diferencia es insignificante. Es probable que acceda a él varias veces en cada página y unos pocos ciclos de CPU no harán ninguna diferencia. Uno puede encontrar mejoras de rendimiento más grandes en otros lugares.