A menudo he visto esta cita utilizada para justificar un código obviamente malo o un código que, si bien no se ha medido su rendimiento, probablemente podría hacerse más rápido con bastante facilidad, sin aumentar el tamaño del código o comprometer su legibilidad.
En general, creo que las primeras micro optimizaciones pueden ser una mala idea. Sin embargo, las macro optimizaciones (cosas como elegir un algoritmo O (log N) en lugar de O (N ^ 2)) a menudo valen la pena y deben hacerse temprano, ya que puede ser un desperdicio escribir un algoritmo O (N ^ 2) y luego bótelo completamente a favor de un enfoque O (log N).
Tenga en cuenta que las palabras pueden ser : si el algoritmo O (N ^ 2) es simple y fácil de escribir, puede tirarlo más tarde sin mucha culpa si resulta ser demasiado lento. Pero si ambos algoritmos son igualmente complejos, o si la carga de trabajo esperada es tan grande que ya sabe que necesitará el más rápido, la optimización temprana es una decisión de ingeniería sólida que reducirá su carga de trabajo total a largo plazo.
Por lo tanto, en general, creo que el enfoque correcto es averiguar cuáles son sus opciones antes de comenzar a escribir código y elegir conscientemente el mejor algoritmo para su situación. Lo más importante, la frase "la optimización prematura es la raíz de todo mal" no es excusa para la ignorancia. Los desarrolladores de carrera deberían tener una idea general de cuánto cuestan las operaciones comunes; deberían saber, por ejemplo,
- que las cadenas cuestan más que los números
- que los lenguajes dinámicos son mucho más lentos que los de tipo estático
- Las ventajas de las listas de matrices / vectores sobre las listas enlazadas, y viceversa.
- cuándo usar una tabla hash, cuándo usar un mapa ordenado y cuándo usar un montón
- que (si funcionan con dispositivos móviles) "double" e "int" tienen un rendimiento similar en equipos de escritorio (FP puede ser incluso más rápido) pero "double" puede ser cien veces más lento en dispositivos móviles de gama baja sin FPU;
- que la transferencia de datos a través de Internet es más lenta que el acceso al HDD, los HDD son mucho más lentos que la RAM, la RAM es mucho más lenta que la caché y los registros L1, y las operaciones de Internet pueden bloquearse indefinidamente (y fallar en cualquier momento).
Y los desarrolladores deben estar familiarizados con una caja de herramientas de estructuras de datos y algoritmos para que puedan usar fácilmente las herramientas adecuadas para el trabajo.
Tener muchos conocimientos y una caja de herramientas personal le permite optimizar casi sin esfuerzo. Poner mucho esfuerzo en una optimización que podría ser innecesaria es malo (y admito caer en esa trampa más de una vez). Pero cuando la optimización es tan fácil como elegir un conjunto / tabla hash en lugar de una matriz, o almacenar una lista de números en doble [] en lugar de cadena [], entonces ¿por qué no? Puede que no esté de acuerdo con Knuth aquí, no estoy seguro, pero creo que estaba hablando de optimización de bajo nivel, mientras que yo estoy hablando de optimización de alto nivel.
Recuerde, esa cita es originalmente de 1974. En 1974 las computadoras eran lentas y el poder de cómputo era costoso, lo que dio a algunos desarrolladores una tendencia a optimizar en exceso, línea por línea. Creo que contra eso estaba presionando Knuth. No decía "no te preocupes por el rendimiento en absoluto", porque en 1974 eso sería una locura. Knuth estaba explicando cómo optimizar; en resumen, uno debe enfocarse solo en los cuellos de botella, y antes de hacerlo debe realizar mediciones para encontrar los cuellos de botella.
Tenga en cuenta que no puede encontrar los cuellos de botella hasta que haya escrito un programa para medir, lo que significa que algunas decisiones de rendimiento deben tomarse antes de que exista algo para medir. A veces, estas decisiones son difíciles de cambiar si se equivocan. Por esta razón, es bueno tener una idea general de cuánto cuestan las cosas para que pueda tomar decisiones razonables cuando no hay datos disponibles.
Qué tan temprano para optimizar y cuánto preocuparse por el rendimiento dependen del trabajo. Al escribir scripts que solo ejecutará unas pocas veces, preocuparse por el rendimiento en general es una pérdida de tiempo completa. Pero si trabaja para Microsoft u Oracle y está trabajando en una biblioteca que miles de otros desarrolladores van a usar de miles de maneras diferentes, puede pagar para optimizar al máximo, de modo que pueda cubrir todos los diversos usar casos de manera eficiente. Aun así, la necesidad de rendimiento siempre debe equilibrarse con la necesidad de legibilidad, facilidad de mantenimiento, elegancia, extensibilidad, etc.