2010-04-20 19 views
9

Los tipos que escribieron Bespin (editor de código basado en la nube basado en la nube [y más]) hablaron recientemente sobre cómo factorizaron una porción del código de Bespin debido a la idea errónea de que JavaScript era lento. Resultó que, cuando todo estaba dicho y hecho, su optimización no produjo mejoras significativas.Conceptos erróneos sobre el cuello de botella de rendimiento más peligroso

Estoy seguro de que muchos de nosotros hacemos un esfuerzo para escribir código "optimizado" basado en conceptos erróneos similares a los del equipo de Bespin.

¿Cuáles son algunos de los errores comunes en el rendimiento de los desarrolladores comúnmente suscritos?

Respuesta

18

En ningún orden en particular:

"Listo, fuego, apunten" - pensando que sabe lo que necesita ser optimizado sin probarlo (es decir adivinando) y luego actuar sobre eso, y ya que doesn No ayuda mucho, por lo tanto, suponiendo que el código debe haber sido óptimo para empezar.

"Penny Wise, libra tonto" - pensar que la optimización es todo acerca de optimización del compilador , quejarse sobre ++i vs i++ mientras que las montañas de tiempo en que se gastan innecesariamente en los diseños exagerados, especialmente de estructuras de datos y bases de datos.

"Swat vuela con un bazooka" - estando tan enamorado de las ideas más geniales que se escuchan en las aulas que se utilizan para todo, independientemente de la escala.

"Fuzzy Thinking about Performance" - eludir términos como "punto de acceso" y "cuello de botella" y "perfilador" y "medir" como si esto fuera bien entendido o relevante. (Apuesto consigo una paliza por eso!) OK, uno a la vez:

  • punto de acceso - ¿Cuál es la definición? Tengo uno: es una región de direcciones físicas donde el registro de PC se encuentra una fracción de tiempo significativa. Es el tipo de cosas que los samplers de PC son buenos para encontrar. Muchos problemas de rendimiento presentan zonas interactivas, , pero solo en los programas más simples se presenta el problema en el mismo lugar donde el punto de acceso es.

  • cuello de botella: un término general utilizado para problemas de rendimiento, implica un canal limitado que limita la rapidez con la que se puede lograr el trabajo. La suposición no declarada es que el trabajo es necesario. En mis décadas de ajuste del rendimiento, de hecho he encontrado algunos problemas como ese, muy pocos. Casi todos son de naturaleza muy diferente. En lugar de tomar la ruta más corta desde el punto A hasta el punto B, se toman pequeños desvíos, en forma de llamadas a función que toman poco código, pero no poco tiempo. Luego, esos desvíos toman más desvíos anidados, a veces 30 niveles de profundidad. Cuanto más anidados estén los desvíos, más probable es que algunos de ellos sean menos de lo necesario (derrochadores, de hecho) y casi siempre surge de galopando generalidad - indulgencia incuestionable en "abstracción".

  • profiler - una cosa buena universal, ¿verdad? Todo lo que tienes que hacer es obtener un generador de perfiles y hacer algunos perfiles, ¿verdad? ¿Alguna vez pensó en lo fácil que es engañar a un perfilador para que le diga una gran cantidad de nada, cuando su objetivo es averiguar lo que necesita reparar para obtener un mejor rendimiento? En algún lugar de su árbol de llamadas, guarde un poco de E/S de archivos, o una pequeña llamada a alguna rutina del sistema, o haga que su gemelo malvado lo haga sin su conocimiento. En algún momento, ese será su problema, y ​​la mayoría de los perfiladores lo perderán por completo porque la única ineficiencia que contemplan es algorítmico ineficiencia. O bien, no todas sus rutinas serán pequeñas, y es posible que no llamen a otra rutina en un número reducido de lugares, por lo que su gráfico de llamadas indica que hay un enlace entre las dos rutinas, pero que llama al. O supongamos que puede darse cuenta de que un gran porcentaje de tiempo se gasta en una ruta A llamadas B llamadas C.Puedes ver eso y pensar que no hay mucho que puedas hacer al respecto, cuando si también puedes ver los datos que pasan en esas llamadas, podrías ver si es necesario. Aquí hay un proyecto divertido: elija su perfilador favorito y luego vea cuántas maneras de engañarlo. Es decir, encuentre formas de hacer que el programa tarde más tiempo sin que el generador de perfiles sea capaz de decir lo que hizo, porque si puede hacerlo de manera intencional, también puede hacerlo sin tener la intención de hacerlo.

  • medida - (es decir, medida tiempo) eso es lo perfiladores han hecho durante décadas, y se enorgullecen de la exactitud y la precisión con la que se miden. Pero mida ¿qué tiempo? y ¿por qué con precisión? Recuerde, el objetivo es localizar con precisión los problemas de rendimiento de, de modo que pueda optimizarlos fructíferamente para obtener una aceleración. Cuando obtienes esa aceleración, es lo que es, independientemente de la precisión con que la hayas calculado de antemano. Si esa precisión de medición se compra a expensas de la precisión de la ubicación, entonces usted acaba de comprar manzanas cuando lo que necesitaba eran naranjas.

Here's a list of myths about performance.

+2

Hmmm, los perfiladores me han sido muy útiles, y he hecho mejoras gracias a que son mensurables y perceptibles ... Realmente no entiendo su punto. – alex

+2

@alex: Sí, encuentran * algunos * problemas. ¿Sabes que no tienes más oportunidades para aceleración? La ausencia de evidencia no es evidencia de ausencia.Aquí hay un ejemplo de lo que quiero decir, donde en varias iteraciones, se demostró una aceleración de más de 40 veces: http://stackoverflow.com/questions/926266/performance-optimization-strategies-of-last-resort/927773#927773 –

+1

+1, aunque no estoy de acuerdo con (o entiendo mal) la parte del "cuello de botella". Mi punto de vista: cuello de botella describe el componente de hardware que limita - por ej. CPU, caché, disco. Cuando se ejecuta un programa computacionalmente pesado, raramente todos los componentes están dentro de sus límites; por lo general, uno será el cuello de botella. Puede reducir la carga general, puede eliminar la "presión" de un componente para que no se produzca un cuello de botella tan temprano y puede mover la "presión" entre los componentes. – peterchen

14

Y esto es lo que sucede cuando uno optimiza sin un perfil válido en la mano. Todo lo que estás haciendo sin un perfil es adivinar y probablemente perder tiempo y dinero. Podría enumerar un montón de otros conceptos erróneos, pero muchos se reducen al hecho de que si el código en cuestión no es un consumidor de recursos superior, probablemente esté bien tal como está. Es como desenrollar un bucle for que está haciendo E/S de disco ...

+4

Definitivamente el concepto erróneo más grande: crees que sabes por qué es lento. Perfil, perfil, perfil! – jpeacock

+4

La palabra clave aquí es _valid_. Asegúrese de que la prueba de rendimiento que usa para identificar los cuellos de botella se asemeje a la carga de producción. –

6
  • Las bases de datos relacionales son lentas.
  • Soy más inteligente que el optimizador.
  • Esto debe ser optimizado.
  • Java es lento

Y, sin relación:

Algunas personas, cuando se enfrenta a un problema, creo "Yo sé, voy a usar expresiones regulares." Ahora ellos tienen dos problemas.

-jwz

+0

¡Demonios, esta respuesta no estaba aquí cuando escribí la mía! LOL. : DDD – slacker

+0

Y lo más gracioso es que nuestras dos respuestas recibieron la misma cantidad de votos: D. – slacker

6

Si puedo convertir todo el código base a [última tecnología Inserte aquí xxx], va a ser mucho más rápido.

+0

Ese concepto erróneo es mucho más común en los PHB que en los propios programadores. Adivina quién toma la decisión ... – slacker

4
  • Optimización de la MAL parte del código (personas, utilizan su perfilador!).
  • El optimizador en mi compilador es inteligente, así que no tengo que ayudarlo.
  • Java es (LOL)
  • Bases de datos relacionales rápidos son rápidos (ROTFL LOL LMAO)
+0

¿puedes ampliar ROTFLLOLLMAO para nosotros? –

+0

@David Murdoch: http://en.wikipedia.org/wiki/LOL – slacker

+0

suspiro. yo sé ROTFLMAO. ¿Cuál es la parte "LLOL" en el medio? ¿O es "LOLL"? :-) –

3

Mis reglas de optimización.

  • no optimizan
  • no optimizan ahora.
  • Perfil para identificar el problema.
  • Optimice el componente que está tomando al menos el 80% del tiempo.
  • Encuentra una optimización que es 10 veces más rápida.

Mi mejor optimización ha sido la reducción de un informe de 3 días a 9 minutos. El código optimizado se aceleró de tres días a tres minutos.

En mi carrera he conocido a tres personas a las que se les había encomendado la tarea de producir un tipo de VAX más rápido que el tipo nativo. Invariablemente habían sido capaces de producir géneros que tomaban solo tres veces más.

2

Las reglas son simples:

  1. Trate de usar las funciones de la biblioteca estándar de primera .
  2. Trate de utilizar la fuerza bruta y la ignorancia en segundo lugar.
  3. Demuestre tiene un problema antes de tratar de hacer cualquier optimización.
5

"Esto tiene que ser lo más rápido posible".

Si no tiene un problema de rendimiento, no tiene que preocuparse por optimizar el rendimiento (más allá de prestar atención al uso de buenos algoritmos).

Este concepto erróneo también se manifiesta en intentos de optimizar el rendimiento para cada aspecto de su programa. Veo esto con mayor frecuencia cuando las personas intentan reducir cada milisegundo el tiempo de ejecución de una aplicación web de bajo volumen sin tener en cuenta que la latencia de la red tomará órdenes de magnitud mayor que el tiempo de ejecución del código, reduciendo el tiempo de ejecución irrelevante de todos modos.

Cuestiones relacionadas