2010-02-11 31 views

Respuesta

278

una lista compilada de las posibles fuentes de mejora son a continuación:

general

  • Hacer uso de un generador de perfiles para descubrir pérdidas de memoria y problemas de rendimiento en su aplicación. personalmente sugiero dotTrace
  • Ejecute su sitio en modo Release, no en modo Debug, durante la producción, y también durante la creación de perfiles de rendimiento. El modo de lanzamiento es mucho más rápido. El modo de depuración puede ocultar problemas de rendimiento en su propio código.

almacenamiento en caché

  • Uso CompiledQuery.Compile() evitando de forma recursiva recompilación de la consulta expresiones
  • caché no propensas a cambio de contenido utilizando OutputCacheAttribute para guardar innecesarios y de acción ejecuciones
  • U Galletas SE para la información no sensible acceso frecuente
  • Utilizar ETags y expiración - Escriba su costumbre ActionResult métodos si es necesario
  • Considere el uso de la RouteName a organizar sus rutas y luego utilizarlo para generar sus enlaces, y tratar de no utilizar el árbol de expresión basado en el método ActionLink.
  • considerar la implementación de una estrategia de almacenamiento en caché de resolución ruta
  • poner el código repetitivo dentro de su PartialViews, evitar hacerla xxxx tiempos: si termina llamando a los mismos parciales 300 veces en el mismo punto de vista, probablemente hay algo mal con ese. Explanation And Benchmarks

Enrutamiento

Seguridad

  • Usar la autenticación de formularios, Mantenga sus datos confidenciales de acceso frecuente en el billete autenticación

DAL

El equilibrio de carga

  • Utilizar, proxies inversos, para repartir la carga del cliente a través de la instancia de aplicación. (Desbordamiento de pila utiliza HAProxy (MSDN).

  • Uso Asynchronous Controllers para implementar acciones que dependen de procesamiento de recursos externos.

lado del cliente

  • Optimizar el lado del cliente, utilice una herramienta como YSlow para sugerencias para mejorar el rendimiento
  • Use AJAX para actualizar los componentes de su UI, evite una actualización completa de la página cuando sea posible.
  • Considere implementar una arquitectura pub-sub -i.e. Comet- para la entrega de contenido contra recarga basada en tiempos de espera.
  • Si es posible, mueva la lógica de generación de gráficos y gráficos al lado del cliente. La generación de gráficos es una actividad costosa. Deferir al lado del cliente su servidor de una carga innecesaria , y le permite trabajar con gráficos localmente sin realizar una nueva solicitud (es decir, gráficos Flex, jqbargraph, MoreJqueryCharts).
  • Uso CDN de guiones y contenidos de medios para mejorar la carga en el lado del cliente (es decir Google CDN)
  • Minify - Compile - su código JavaScript con el fin de mejorar el tamaño de su guión
  • Mantener el tamaño de la galleta pequeña, ya que las cookies se envían a el servidor en cada solicitud.
  • Considere usar DNS and Link Prefetching cuando sea posible.

configuración global

  • Si utiliza la maquinilla de afeitar, añada el siguiente código en su global.asax.cs, por defecto, Asp.Net MVC hace con un motor aspx y un motor de la maquinilla de afeitar . Esto solo usa RazorViewEngine.

    ViewEngines.Engines.Clear(); ViewEngines.Engines.Add(new RazorViewEngine());

  • Añadir gzip (compresión HTTP) y caché estático (imágenes, css, ...) en su web.config <system.webServer> <urlCompression doDynamicCompression="true" doStaticCompression="true" dynamicCompressionBeforeCache="true"/> </system.webServer>

  • quitar módulos HTTP no utilizados
  • Lávatelo HTML como momento en que se genera (en su web.config) y deshabilitar estado de vista si no lo está utilizando <pages buffer="true" enableViewState="false">
+6

Espero que signifique que pierdo rendimiento cuando, por ejemplo, ¿Tiene una vista que muestra un conjunto de resultados irritando a través de un IList y llama a Render.PartialView ("Fila", elemento) para cada elemento de la lista? ¿Cuánto pierdo? o ¿cómo podría medir la ganancia de rendimiento? –

+0

@SDReyes - ¿Cuál es el significado de ** pub-sub architecture **? – xameeramir

+0

Esto es genial. Sin embargo, el enlace Uber Profiler está muerto. ¿Debería estar vinculado a uno de los perfiladores específicos de ORM? – shanabus

6

No es una optimización que haga añicos la tierra, pero pensé en tirar esto por ahí - Use CDN's for jQuery, etc..

Cita del propio ScottGuard: Microsoft Ajax CDN le permite mejorar significativamente el rendimiento de ASP.NET Web Forms y las aplicaciones ASP.NET MVC que utilizan ASP.NET AJAX o jQuery. El servicio está disponible de forma gratuita, no requiere ningún registro y puede utilizarse con fines comerciales y no comerciales.

Incluso utilizamos el CDN para nuestras partes web en Moss que usan jQuery.

10

La sugerencia básica es seguir REST principles y los siguientes puntos ata algunos de estos principios en el marco ASP.NET MVC:

  1. Haga sus controladores stateless - esto es más de un 'Web rendimiento/la sugerencia de escalabilidad (a diferencia del rendimiento a nivel de micro/máquina) y una importante decisión de diseño que afectaría el futuro de sus aplicaciones, especialmente en caso de que se haga popular o si necesita cierta tolerancia a fallas, por ejemplo.
    • no utilizan las sesiones
    • No utilice TempData - que utiliza sesiones
    • No trate de 'caché' todo 'antes de tiempo'.
  2. Uso Forms Authentication
    • Mantenga sus datos confidenciales de acceso frecuente en el vale de autenticación
  3. utilizar cookies con la información sensible no se accede con frecuencia
  4. Haga su resources cachable en la web
  5. compilar el JavaScript. There is Closure compiler library para hacerlo también (seguro there are others, just search for 'JavaScript compiler' también)
  6. Use CDN (Content Delivery Network) - especialmente para sus archivos multimedia de gran tamaño y más.
  7. considerar diferentes tipos de almacenamiento para sus datos, por ejemplo, archivos, almacenes de clave/valor, etc. - no sólo SQL Server
  8. Por último, pero no menos importante, probar su sitio web para un rendimiento
10

Code Climber y this blog entry proporcionan formas detalladas de aumentar el rendimiento de la aplicación.

La consulta compilada aumentará el rendimiento de su aplicación, pero no tiene nada en común con ASP.NET MVC. Se acelerará cada aplicación de db, por lo que no se trata realmente de MVC.

6

Además, si usa NHibernate, puede activar y configurar el caché de segundo nivel para consultas y agregar al ámbito de consultas y tiempo de espera. Y hay un generador de perfiles kick ass para EF, L2S y NHibernate - http://hibernatingrhinos.com/products/UberProf. Te ayudará a sintonizar tus consultas.

+0

Ayende publicó recientemente un blog sobre cómo EF Profiler lo ayudó a sintonizar una aplicación MVC de muestra: http://ayende.com/Blog/archive/2010/05/17/analyzing-the-mvc-music-store-data-access.aspx –

4

Además de toda la gran información sobre la optimización de su aplicación en el lado del servidor, diría que debería echar un vistazo a YSlow. Es un recurso excelente para mejorar el rendimiento del sitio en el lado del cliente.

Esto se aplica a todos los sitios, no solo a ASP.NET MVC.

3

Una cosa muy fácil de hacer es pensar de forma asíncrona al acceder a los datos que desea para la página. Ya sea que esté leyendo un servicio web, un archivo, una base de datos u otra cosa, use el modelo asíncrono tanto como sea posible. Si bien no necesariamente ayudará a que una página sea más rápida, ayudará a su servidor a tener un mejor rendimiento general.

7

Esto puede parecer obvio, pero ejecute su sitio en modo Release, no en modo Debug, durante la producción y también durante la creación de perfiles de rendimiento. El modo de lanzamiento es mucho más rápido. El modo de depuración puede ocultar problemas de rendimiento en su propio código.

3

que también añadirá:

  1. Use Sprites: Sprites son una gran cosa para reducir la petición. Fusiona todas sus imágenes en una sola y utiliza CSS para obtener buena parte del sprite . Microsoft proporciona una buena biblioteca para hacerlo: Sprite and Image Optimization Preview 4.

  2. Caché Su objeto de servidor: Si tiene algunas listas de referencias o datos que cambiarán rara vez, puede almacenarlos en la memoria en lugar de consultar la base de datos todo el tiempo.

  3. Uso ADO.NET Entity Framework en lugar de: EF4 or EF5 son grandes para reducir el tiempo de desarrollo, pero va a ser doloroso para optimizar. Es más simple optimizar un stored procedure que la Entidad Framework. Por lo tanto, debe usar los procedimientos de la tienda tanto como sea posible. Dapper proporciona una forma simple de consultar y asignar SQL con muy buen rendimiento de .

  4. Caché Página parcial o página: MVC proporciona un filtro fácil de almacenar en caché según algunos parámetros, así que úselo.

  5. Reducir llamadas a la base de datos: puede crear una solicitud de base de datos única que devuelve múltiples objetos. Consulte en el sitio web de Dapper.

  6. Siempre tenga una arquitectura limpia: tenga una arquitectura limpia de n niveles, incluso en un proyecto pequeño. Le ayudará a mantener su código limpio, y será más fácil optimizarlo si es necesario.

  7. Puede echar un vistazo a esta plantilla "Neos-SDI MVC Template" que creará una arquitectura limpia para usted con una gran cantidad de mejoras en el rendimiento por defecto (comprobar MvcTemplate sitio web).

+0

¿Crees que es mejor ejecutar un procedimiento almacenado que devuelva más conjuntos de resultados y luego ejecutar más procedimientos almacenados en modo asíncrono? – Muflix

2

1: Get Timings. Hasta que sepa dónde está la ralentización, la pregunta es demasiado amplia para responder. Un proyecto en el que estoy trabajando tiene este problema preciso; No hay registro para saber cuánto tiempo toman ciertas cosas; solo podemos adivinar las partes lentas de la aplicación hasta que agreguemos los tiempos al proyecto.

2: Si tiene operaciones secuenciales, no tema teclear ligeramente. ESPECIALMENTE si las operaciones de bloqueo están involucradas. PLINQ es tu amigo aquí.

3: Pregenerate sus Vistas MVC cuando Publicaciones ... Eso le ayudará con algunos de la 'primera visita a la página'

4: Algunos abogan por el procedimiento almacenado/ADO ventajas de la velocidad. Otros argumentan a favor de la velocidad del desarrollo de EF y una seprataión de niveles más clara y su propósito. He visto diseños realmente lentos cuando SQL y las soluciones para usar Sprocs/Views para la recuperación de datos y el almacenamiento. Además, su dificultad para evaluar aumenta. Nuestra base de código actual que estamos convirtiendo de ADO a EF no está empeorando (y en algunos casos es mejor) que el antiguo modelo Hand-Rolled.

5: Dicho esto, piense en la aplicación Warmup. Parte de lo que hacemos para ayudar a eliminar la mayoría de nuestros problemas de rendimiento de EF fue agregar un método especial de calentamiento. No precompila ninguna consulta ni nada, pero ayuda con gran parte de la carga/generación de metadatos. Esto puede ser aún más importante cuando se trata de modelos de Code First.

6: Como han dicho otros, no utilice el estado de sesión o ViewState si es posible. No son necesariamente optimizaciones de rendimiento que los desarrolladores piensan, pero una vez que comienzas a escribir aplicaciones web más complejas, quieres capacidad de respuesta. El estado de la sesión lo excluye. Imagine una consulta de larga ejecución. Decide abrir una nueva ventana y probar una menos compleja. Bien, bien podría haber esperado con estado de sesión activado, porque el servidor esperará hasta que se complete la primera solicitud antes de pasar a la siguiente para esa sesión.

7: minimice los viajes redondos a la base de datos. Guarde cosas que usa con frecuencia pero que no cambiarán de manera realista a .Net Cache. Intente agrupar sus insertos/actualizaciones siempre que sea posible.

7.1: Evitar el código de acceso a datos en sus puntos de vista de afeitar sin una muy buena razón. No estaría diciendo esto si no lo hubiera visto. Ya estaban accediendo a sus datos al armar el modelo, ¿por qué diablos no lo incluían en el modelo?

1

En su clamor por optimizar el lado del cliente, no se olvide de la capa de la base de datos. Tuvimos una aplicación que pasó de 5 segundos a cargar hasta 50 segundos durante la noche.

En la inspección, habíamos hecho un montón de cambios de esquema. Una vez que actualizamos las estadísticas, de repente se volvió tan receptivo como antes.

1
  1. Implementar Gzip.
  2. Utilice la representación asincrónica para vistas parciales.
  3. Minimice las visitas a la base de datos.
  4. Use una consulta compilada.
  5. Ejecuta un generador de perfiles y encuentra hits innecesarios. Optimice todos los procedimientos almacenados que tarden más de 1 segundo para devolver una respuesta.
  6. Use el almacenamiento en caché.
  7. Utilice bundling minification optimización.
  8. Use las utilidades de HTML 5 como la memoria caché de la sesión y el almacenamiento local para los contenidos de solo lectura.
0

siguientes son cosas que hacer

  1. modo de caché modo
  2. Pipeline Kernel
  3. Retire los módulos no utilizados
  4. runAllManagedModulesForAllRequests
  5. No escriba en wwwroot
  6. Eliminar vista sin usar motores y lenguaje
0

El uso de Bundling and Minification también lo ayuda a mejorar el rendimiento. Básicamente, reduce el tiempo de carga de la página.

2

Solo quería agregar mis 2 centavos. La forma más efectiva de optimizar la generación de rutas URL en una aplicación MVC es ... no generarlas en absoluto.

La mayoría de nosotros más o menos saben cómo URL se generan en nuestras aplicaciones de todos modos, por lo que el simple uso de estática Url.Content("~/Blahblah") en lugar de Url.Action() o Url.RouteUrl() siempre que sea posible, es mejor que todos los otros métodos por los casi 20 veces y aún más.

PS. Ejecuté un punto de referencia de un par de miles de iteraciones y publiqué los resultados on my blog si estaba interesado.

Cuestiones relacionadas