2012-08-01 23 views
5

Tengo Mini-Profiler instalado en un nuevo sitio MVC4 y noto un gran tiempo de espera para ciertos Find: DisplayTemplates incluyendo String y DateTime. A continuación hay un ejemplo. En otra pregunta, Sam azafrán dijo lo siguiente sobre el paso hallazgoFind: DisplayTemplates Speed ​​

En posteriores ejecuciones es la velocidad del rayo (a menos que tenga algo realmente malo pasando)

Pero el siguiente que ocurre en cada carga de página:

http://localhost:80/SLS.Site/s/hogwarts/lunch...  2.6 +0.0 
    Check School Permissions       2.4 +2.0  1 sql 0.9 
    Controller: SchoolAdmin.LunchGroupsController... 4.0 +4.5 
    Find: Index          0.4 +8.6 
    Render : Index         70.0 +9.1  2 sql 13.0 
    Controller: SchoolAdmin.LunchGroupsController... 2.6 +12.3 
    Find: BuildingTree        0.4 +14.9 
    Render partial: BuildingTree      4.4 +15.4 1 sql 3.2 
    Controller: SchoolAdmin.LunchGroupsController... 3.3 +20.2 
    Find: Teachers         0.6 +23.6 
    Render partial: Teachers       4.3 +24.3 1 sql 2.4 
    Find: DisplayTemplates/String     409.3 +31.9 
    Render partial: _UserContext      0.0 +441.3 
    Find: _LoginPartial        1.2 +441.4 
    Render partial: _LoginPartial      0.2 +442.6 
                    3.9 % in sql 

¿Alguna idea?

Editar

que tenían áreas de instalación 4, así que pensé que estaba atravesando todos los directorios en busca de un partido, así que eliminado 2 de las zonas y tienen el mismo comportamiento.

+0

Acabo de hacer una prueba después de tener un problema similar.Parece que se difiere una cantidad significativa de trabajo hasta la primera llamada a DisplayFor, por lo que el tiempo se hincha –

Respuesta

2

Una vez que coloqué un bloque de perfiles alrededor de los paquetes en el <head> pude ver dónde se estaba gastando realmente el tiempo. Mini-profiler me estaba engañando, originalmente: el tiempo era no gastado en DisplayTemplates/String pero en otro lugar!

En mi caso, la demora estaba ocurriendo en la agrupación de scripts de MVC4 RC.

Quité los paquetes y todo está bien.

Ver tema relacionado a continuación:

MVC4 RC script bundling very slow

+1

Lo importante aquí es que el problema definitivamente puede estar relacionado con algo más que el DisplayFor. El problema de rendimiento que estaba buscando era una búsqueda de AD en cada elemento de nuestro menú. La lección clave de esta respuesta es ampliar su búsqueda; de lo contrario, la categorización predeterminada de MiniProfiler puede llevarlo por mal camino. –

3

que tenía exactamente el mismo problema ... Después de buscar en torno encontré que estaba usando:

@DisplayFor(x => x.StringProperty);

Después de pensarlo y descubrir cómo todos los métodos DisplayFor/EditorFor funcionan al crear algunas plantillas yo mismo, no tiene sentido.

(Un poco de explicación sobre cómo DisplayFor/EditorFor obras)

Al utilizar DisplayFor/Editor para, MVC obtiene el type del objeto y luego busca en el directorio Views/ControllerName/DisplayTemplates para una vista con el mismo nombre que esa escriba, en este caso, está buscando Views/ControllerName/DisplayTemplates/String.cshtml. Como no existe, también hace lo mismo en el directorio de vistas Shared/DisplayTemplates, nuevamente, no existirá.

(Este bit siguiente es especulación)

Me suponer que ya que no puede encontrar la plantilla Display/Editor relevante, se realiza entonces una ToString() en el objeto, como una conmutación por error.

Como sólo está mostrando un tipo cadena de todos modos, lo que tendría sentido que no utiliza el DisplayFor(x => StringProperty) y sólo tiene que utilizar @Model.StringProperty, que no causaría MVC para buscar un DisplayTemplate, y simplemente hacen como una cadena, que se va hacer de todos modos.

+3

Es una pena que esta no sea la respuesta aceptada, porque es un buen consejo. La función 'Find: DisplayTemplates' es muy lenta, y a menos que esté haciendo una renderización compleja de plantillas, simplemente use directamente los valores del modelo. Evite 'Html.DisplayFor' como la peste. – Jez

+2

Saludos: buenas habilidades en 'Html.DisplayFor ', ¡también he visto algunos problemas de velocidad! Como dices, ¡evítalo a menos que estés usando tus propias plantillas! –