2010-08-06 21 views
6

¿Alguien conoce sitios/libros/artículos que cubren las mejores prácticas o la teoría sobre los patrones de diseño en aplicaciones de alto rendimiento? Parece que muchos de los patrones usan indirección/abstracción/encapsulación de una manera que puede afectar el rendimiento en un código de cálculo intensivo. Los patrones de diseño de Head First e incluso GoF mencionan la posibilidad de éxitos de rendimiento con muchos de los patrones, pero sin más consejos concretos sobre cómo lidiar con ello.Eficiencia de los patrones de diseño

Respuesta

5

Me sorprende que no estamos pidiendo lo que problemas de rendimiento que está teniendo!

En mi experiencia, los problemas de rendimiento suelen estar ligados a situaciones y situaciones específicas. Los patrones de diseño, por otro lado, son soluciones a problemas más generales y abstractos. Parecería un poco incómodo abordar ambos en el mismo texto: ¿qué posibilidades hay de que muchas soluciones "sin patrones" comparen el autor con el rendimiento de un patrón de diseño? Cuando el problema de rendimiento es general, ciertamente ya existen patrones para resolverlos: el Flyweight es un buen ejemplo.

Las penalizaciones impuestas por el uso de un patrón de diseño son de un conjunto finito, muy pequeño: introducción de llamadas virtuales, latencia añadida debido a delegación, consumo de memoria adicional debido a la proliferación de objetos, etc. Si, después del perfilado, notas que estas son las causas de tus problemas, existen formas conocidas de minimizarlas.

Conocer los patrones también puede ser útil para resolver problemas de rendimiento. Primero, alguien ya mencionó que los patrones descomponen un problema en bits más pequeños: esto podría facilitar localizar el origen del problema y aislar el código feo pero de rendimiento. También crean un marco de razonamiento y expectativas para los desarrolladores. Si debe introducir una desviación por motivos de rendimiento, será obvio: "Excepto aquí, donde renunciamos a X y hacemos Y para mejorar el rendimiento, esta es una Cadena de Responsabilidad ". Son reglas que se deben romper cuando sea necesario.

(Por desgracia, no es una muy buena patrón para conseguir un buen rendimiento: medida, identificar, corregir.)

+0

Su respuesta es más clara y articulada que la mía, mientras dice aproximadamente lo mismo. – Omnifarious

0

El patrón de diseño se centra realmente en cómo se estructura el código y se define la abstracción e interacción de la clase. El rendimiento de su rendimiento computacional se verá principalmente afectado por la forma en que escriba la implementación del código real (cuerpo del método).

Para C++ Definitivamente sugiero leer el libro de Scott Meyers en Effective C++ y la serie de libros C++ más eficaz, que en sí mismo realmente revela muchas expresiones idiomáticas al escribir código de alto rendimiento.

+0

Hmm ... son muy buenos libros. Pero no creo que se gaste mucho tiempo en problemas de rendimiento. Hay algunos casos en los que te mostrarán "Problema de rendimiento dado A, puedes resolverlo usando el modisto B de C++", pero no hay nada en el diseño del programa para la velocidad en ellos. –

+0

Estoy de acuerdo, no directamente, sino más bien en la apreciación del núcleo interno/memoria y cómo escribir código limpio y efectivo. Efficient C++ también de Addison Wesley es probablemente más adecuado para la pregunta formulada. No he escrito mucho C/C++ en los últimos 2 años y la última vez que leí esos libros fue hace años y por lo tanto no puedo señalar específicamente los detalles –

4

Existen patrones de diseño para ayudarlo a comprender cómo diseñar software o mejorar su flexibilidad. La forma en que implemente el patrón determina qué tipo de penalización (o beneficio) de rendimiento verá con su uso.

Existen algunos patrones porque esa forma general de estructurar cosas generalmente conduce a programas más rápidos. Pero a diferencia de los algoritmos, no hay una buena manera de analizar formalmente un patrón para decidir qué tan lento o rápido es.

Mi consejo sería utilizar un patrón si le ayuda a descubrir cómo diseñar una pieza de código en particular, o si necesita refactorizar para hacer que el código sea más flexible o claro. Si luego tiene problemas de rendimiento, use técnicas de perfil estándar para encontrarlos.

Si realiza una refacturación cuando tiene problemas de rendimiento, tal vez el costo no justifique el refactor, o tal vez haya una forma de mitigarlo. Si está diseñando un nuevo código, tal vez haya una forma de modificar las cosas para solucionar el problema de rendimiento si verdaderamente se basa en la dirección indirecta necesaria para que el patrón funcione.

3

El consejo más concreto es: perfilarlo en su aplicación y ver cuánto impacto realmente produce.

Cualquier otro consejo va a ser considerablemente más general y no necesariamente se aplica bien a la forma en que ha implementado un patrón determinado en su aplicación con su compilador en su plataforma.

0

Puede leer las entradas de Herb Sutter en "Concurrencia efectiva" para cosas que involucran patrones de multiprocesamiento y concurrencia y cómo afectan el rendimiento.

http://herbsutter.com/

+0

¿Qué tiene esto que ver con los patrones de diseño de estilo GoF? –

+0

OP habló sobre aplicaciones de alto rendimiento y este anillos de multi-threading y concurrencia en mi opinión. – David

+0

No pregunté sobre el rendimiento. Por supuesto, el enhebrado es una optimización del rendimiento. Le pregunté qué tiene que ver con los patrones de diseño de estilo GoF. –

1

Los patrones de diseño son en su mayoría formas de romper su programa en pedazos más pequeños, que son más fáciles de reutilizar, componer, diseño y prueba. Varios patrones de diseño darán como resultado un código que funciona peor que un diseño más simple, pero tienen una ventaja significativa cuando se considera la regla 80/20.

La regla 80/20 dice que el 80% del tiempo de ejecución de su programa se utilizará para ejecutar el 20% de su código. Cuando su programa es agradable y modular, es fácil incluirlo en un generador de perfiles y ver exactamente qué componente puede ajustarse/optimizarse, o dónde tiene sentido utilizar un diseño menos flexible para mejorar el rendimiento. Sin embargo, al tener el diseño que se separó inicialmente inicialmente, es más fácil encontrar puntos calientes de rendimiento.

1

Un término que puede ayudarlo a obtener mejores resultados es el 'lenguaje de patrones'. Es una colección de patrones que van juntos para algún propósito.Si tiene un objetivo más específico que el alto rendimiento, alguien puede haber trazado una ruta a través de los patrones de su dominio, por ejemplo: pattern language for parallel software. Aquí hay otra bonita colección de parallel programming patterns de UIUC, un hervidero de patrones de trabajo.

Los chicos de la ECA/TAO tienen una gran cantidad de papers sobre los patrones de red de alto rendimiento usando C++

0

patrones de diseño GoF son probados sobre el uso de patrones para resolver problemas comunes con elegantes código, fácil de mantener. No se enfocan en el rendimiento.

Si quieres pautas de rendimiento, puede que tenga que mirar a los patrones de la arquitectura del sistema, algoritmos, estructuras de datos, etc.

¿Qué hace su aplicación?

Si su aplicación está en C++, y está escrita con sensatez, es probable que su código se ejecute deslumbrantemente rápido en hardware moderno, hasta que tenga que esperar por E/S. La excepción sería algo así como el análisis de imágenes en tiempo real que consume mucho del procesador.

Si el rendimiento es un problema, ¿realmente se refiere al rendimiento de E/S? (Disco, DB, red, etc.)

hay 'patrones' que permiten que su aplicación realice con frecuencia, incluso mientras la espera de E/S (devoluciones de llamada asincrónicas etc.)

Si se trata de una carga desigual , por lo que la carga pico puede ser mucho mayor que la carga promedio, un patrón de arquitectura comúnmente empleado es desvincular los componentes del sistema con las colas de mensajes.

0

Recuerda el viejo dicho "Puedes tenerlo bueno, rápido y barato, elige dos"
Los patrones de diseño abordan lo bueno. Se necesita una buena base para que el código pueda ser preciso y fácil de mantener.
Si el rendimiento es un problema, entonces compare y luego optimice las secciones que le dan problemas. Muchas veces, el rendimiento es solo una cuestión de elegir un algoritmo adecuado, pero puede significar que necesitas dividirlo en algún código horriblemente optimizado para ese 10% que ocupa el 90% del tiempo. Solo asegúrate de comentar el S ^^ T.