2010-02-12 20 views
14

Nuestro diseñador está utilizando Blend para dar estilo a nuestra aplicación WPF. Cuando elige los recursos locales para las propiedades, Blend los aplicará como {DynamicResource} en lugar de {StaticResource}. Supongo que Blend hace esto porque permite volver a tematizar la aplicación en tiempo de ejecución sin tener que reiniciarla.¿Existe un costo de rendimiento significativo para DynamicResource en lugar de StaticResource?

Mi pregunta es: ¿hay un costo de rendimiento significativo para esta búsqueda adicional? ¿Deberíamos pedirle al diseñador que regrese y cambie manualmente esas Dinámicas a Estática?

Aquí es una pregunta muy bueno, así que explica la diferencia entre los tipos: What's the difference between StaticResource and DynamicResource in WPF?

Respuesta

25

Desafortunadamente, este es un caso en el que es muy difícil hacer una comparación directa del rendimiento relativo, ya que el lugar donde aparecería cualquier degradación es profundo en el motor WPF. En los primeros días de WPF, el uso de StaticResource fue uno de los cambios de ajuste de rendimiento estándar que se recomendaba y tendíamos a seguirlo bastante estrictamente en nuestra organización y recomendarlo a otros. Me molestó mucho que Blend hiciera todo a Dynamic, aunque eso le ayudó a procesar recursos de otros archivos de forma adecuada en el momento del diseño.

Con el tiempo, mi visión sobre esto ha cambiado, debido en parte a la experiencia personal, pero también a los comentarios de las personas en el equipo de Blend en Microsoft. Como seguramente sabrá, Blend está escrito completamente en WPF y tiene un tema alternativo completo (Light) que se puede activar mientras se ejecuta la aplicación. Esto es posible porque usaron DynamicResource para prácticamente todo su estilo. Según ellos, esto realmente no les causó ningún problema de rendimiento real. Dado que Blend es probablemente la aplicación WPF más utilizada en la actualidad, tiendo a dar un peso significativo a sus puntos de vista.

La otra cosa a tener en cuenta es la utilidad real de DynamicResource. La capacidad de cambiar el estilo sobre la marcha es una parte del mismo, pero también la flexibilidad que le brinda al crear su jerarquía de Recursos puede facilitar mucho la administración de estilos compartidos. Estoy seguro de que se encontró con una situación en la que una referencia de StaticResource explotó en el tiempo de ejecución porque el recurso al que apuntaba debía cargarse en una rama diferente de la jerarquía.

Obviamente, StaticResource es muy útil para señalar una clave específica que sabe que estará disponible en el momento adecuado. Cuando escribo a mano XAML, todavía tiendo a usarlo todo el tiempo. Pero dada la productividad que obtiene al tener un diseñador que genere su XAML en Blend, cualquier ganancia de rendimiento pequeña que pueda obtener probablemente no valga la pena de la mano, manteniendo todo como Estático.

+0

Con respecto a su afirmación "Obviamente, StaticResource es muy útil para señalar una clave específica usted sabe que estará disponible en el momento adecuado ". ¿Esto significa que un DynamicResource pierde la verificación del tipo de tiempo de compilación y se mueve al tiempo de ejecución? – scobi

+0

Sí. En la mayoría de los casos, una referencia de DynamicResource que no se resuelve obtendrá un valor predeterminado (como Negro para Pinceles) y esperará a que aparezca la clave que está buscando. Realmente no hay ninguna forma para que el compilador valide esa situación por sí mismo. –

+0

¡Eso fue muy útil, gracias! –

5

No se dice que es una diferencia de rendimiento, pero si es "significativo" dependerá de la cantidad de búsquedas dinámicas están sucediendo. A menos que tenga miles de referencias de DynamicResource, probablemente no se notará de ninguna manera; si los recursos dinámicos se desempeñaron mucho peor que los estáticos, sospecho que Blend sería más conservador al generarlos.

De hecho, cuando me encontré con una prueba ingenuo, me encontré con el resultado contrario a la intuición de que DynamicResource corrió más rápido de StaticResource (con 3000 referencias de recursos, vi tiempos de carga de alrededor de 200 ms cuando utilicé DynamicResource para todo, frente a alrededor de 400 ms para StaticResource).

Esto fue una prueba poco realista por varias razones: todas las referencias eran a la misma cosa, me estaba ejecutando bajo el depurador, etc. etc. Pero sugiere que sería prematuro esforzarse en cambiar la salida de mezcla "solo en caso "- y que si nota una desaceleración, puede que no necesariamente sea por culpa de las referencias de DynamicResource - ¡siempre mida!

+1

Creo que las DynamicResouces se cargan en un subproceso secundario y solo se cargan cuando el elemento que las utiliza se vuelve visible, por lo que la prueba de velocidad es muy difícil –

1

Desafortunadamente, si cambia los recursos dinámicos a estáticos, se romperá la mezcla. Esto parece ser cierto, especialmente cuando se utilizan UserControls que hacen referencia a los recursos dinámicos. Si los cambia a estáticos, el control no se representará cuando estén alojados dentro de otro control en Blend.

Cuestiones relacionadas