A menudo he visto que esta cita se utiliza para justificar un código o código obviamente malo que, si bien su rendimiento no se ha medido, probablemente podría acelerarse más fácilmente, sin aumentar el tamaño del código ni comprometer su legibilidad.
En general, creo que las microoptimizaciones iniciales pueden ser una mala idea. Sin embargo, las macro-optimizaciones (cosas como elegir un algoritmo O (registro N) en lugar de O (N ^ 2)) a menudo valen la pena y se deben hacer antes, ya que puede ser un desperdicio escribir un algoritmo O (N ^ 2) y luego deséchelo completamente a favor de un enfoque O (registro N).
Tenga en cuenta que las palabras pueden ser : si el algoritmo O (N ^ 2) es simple y fácil de escribir, puede desecharlo 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á la más rápida, entonces 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 el código y elegir conscientemente el mejor algoritmo para su situación. Más importante aún, la frase "la optimización prematura es la raíz de todo mal" no es excusa para la ignorancia. Los desarrolladores de carreras 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 números
- que los lenguajes dinámicos son mucho más lentos que los lenguajes de tipo estático
- las ventajas de las listas de matrices / vectores sobre las listas vinculadas, 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 los 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 la del disco duro, las unidades de disco duro son mucho más lentas 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 un montón de 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 malvada (y admito que caigo 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 en la cadena [], ¿por qué no? Puede que no esté de acuerdo con Knuth aquí, no estoy seguro, pero creo que él estaba hablando de optimización de bajo nivel mientras que estoy hablando de optimización de alto nivel.
Recuerde, esa cita es originalmente de 1974. En 1974 las computadoras eran lentas y la potencia de cómputo era costosa, lo que dio a algunos desarrolladores una tendencia a sobre-optimizar, línea por línea. Creo que eso es contra lo que Knuth estaba presionando. No estaba diciendo "no te preocupes por el rendimiento", porque en 1974 eso sería una locura. Knuth explicaba cómo optimizar; en resumen, uno debe centrarse 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 deben tomarse algunas decisiones de rendimiento 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 lo que cuestan las cosas para que pueda tomar decisiones razonables cuando no haya datos disponibles.
La rapidez con la que se optimiza y cuánto debe preocuparse por el rendimiento depende del trabajo. Al escribir scripts que solo ejecutará unas cuantas veces, preocuparse por el rendimiento en general es una completa pérdida de tiempo. Pero si trabaja para Microsoft u Oracle y está trabajando en una biblioteca que miles de otros desarrolladores van a usar de miles de formas diferentes, puede ser útil para optimizar el infierno, así que que puede cubrir todos los diversos casos de uso eficientemente. Aun así, la necesidad de rendimiento siempre debe equilibrarse con la necesidad de legibilidad, facilidad de mantenimiento, elegancia, extensibilidad, etc.