Vale la pena señalar que la cita original de Knuth provino de un artículo que escribió promoviendo el uso goto
en áreas cuidadosamente seleccionadas y medidas como una forma de eliminar puntos críticos. Su cita fue una salvedad que agregó para justificar su razón de ser para usar goto
con el fin de acelerar esos ciclos críticos.
[...] nuevamente, esto es un ahorro notable en la velocidad de funcionamiento general, si, digamos, el valor promedio de n es aproximadamente 20, y si la rutina de búsqueda se realiza aproximadamente un millón de veces en el programa. Tales optimizaciones de bucle [usando gotos
] no son difíciles de aprender y, como he dicho, son apropiadas solo en una pequeña parte de un programa, sin embargo, a menudo producen ahorros sustanciales. [...]
Y continúa:
La sabiduría convencional compartida por muchos de los ingenieros de software actuales exige ignorar la eficiencia en lo pequeño; pero creo que esto es simplemente una reacción exagerada a los abusos que ven ser practicados por programadores tontos que no pueden depurar ni mantener sus programas "optimizados". En las disciplinas de ingeniería establecidas, una mejora del 12%, de fácil obtención, nunca se considera marginal; y creo que el mismo punto de vista debería prevalecer en la ingeniería de software. Por supuesto que no me molestaría en hacer tales optimizaciones en un solo trabajo, pero cuando se trata de preparar programas de calidad, no quiero restringirme a herramientas que me niegan tales eficiencias [es decir, goto
declaraciones en este contexto].
Tenga en cuenta cómo usó "optimizado" entre comillas (el software probablemente no sea realmente eficiente). También tenga en cuenta que no solo está criticando a estos programadores "tontos y tontos", sino también a las personas que reaccionan sugiriendo que siempre se deben ignorar las pequeñas ineficiencias. Finalmente, a la parte que se cita con frecuencia:
No hay duda de que el grial de la eficiencia conduce al abuso. Los programadores pierden una enorme cantidad de tiempo pensando o preocupándose por la velocidad de las partes no críticas de sus programas, y estos intentos de eficiencia en realidad tienen un fuerte impacto negativo cuando se consideran la depuración y el mantenimiento. Deberíamos olvidarnos de las pequeñas eficiencias, digamos el 97% del tiempo; La optimización prematura es la fuente de todos los males.
... y luego algo más sobre la importancia de las herramientas de creación de perfiles:
A menudo es un error hacer juicios a priori sobre qué partes de un programa son realmente críticas, ya que la experiencia universal de los programadores que han estado usando herramientas de medición ha sido que sus conjeturas intuitivas fallan. Después de trabajar con estas herramientas durante siete años, me he convencido de que todos los compiladores escritos a partir de ahora deberían estar diseñados para proporcionar a todos los programadores comentarios que indiquen qué partes de sus programas están costando más; de hecho, esta información debe proporcionarse automáticamente a menos que se haya desactivado específicamente.
La gente ha hecho un mal uso de su cita en todas partes, a menudo sugiriendo que las microoptimizaciones son prematuras cuando todo su artículo abogaba por microoptimizaciones. Uno de los grupos de personas que estaba criticando que se hacen eco de esta "sabiduría convencional", como él dijo de ignorar siempre las eficiencias en lo pequeño, a menudo hace un mal uso de su cita, que originalmente estaba dirigida, en parte, contra esos tipos que desalientan todas las formas de microoptimización. .
Sin embargo, era una cita a favor de las microoptimizaciones aplicadas de manera apropiada cuando las usa una mano experimentada que sostiene un perfilador. El equivalente analógico actual podría ser como: "La gente no debería intentar optimizar su software, pero los asignadores de memoria personalizados pueden marcar una gran diferencia cuando se aplican en áreas clave para mejorar la localidad de referencia" , o " Código SIMD escrito a mano con un Por lo tanto, una repetición es realmente difícil de mantener y no debería usarla por todas partes, pero puede consumir memoria mucho más rápido cuando se aplica adecuadamente por una mano experimentada y guiada " .
Cada vez que intente promover microoptimizaciones cuidadosamente aplicadas como Knuth promovió anteriormente, es bueno incluir una exención de responsabilidad para disuadir a los novatos de emocionarse demasiado y hacer intentos ciegos de optimización, como reescribir todo su software para usar goto
. Eso es en parte lo que estaba haciendo. Su cita fue efectivamente parte de un gran descargo de responsabilidad, al igual que alguien que salta en motocicleta sobre un pozo de fuego en llamas podría agregar un descargo de responsabilidad de que los aficionados no deberían intentar esto en casa mientras simultáneamente critican a aquellos que lo intentan sin el conocimiento y el equipo adecuados y se lastiman. .
Lo que él consideró "optimizaciones prematuras" fueron optimizaciones aplicadas por personas que efectivamente no sabían lo que estaban haciendo: no sabían si la optimización era realmente necesaria, no medían con las herramientas adecuadas, tal vez no entendían la naturaleza de su compilador o arquitectura de computadora, y sobre todo, eran "pennywise-and-pound-tont", lo que significa que pasaron por alto las grandes oportunidades para optimizar (ahorrar millones de dólares) al tratar de reducir centavos, y todo mientras crean código que no pueden depurar y mantener más eficazmente.
Si no encaja en la categoría "pennywise-and-pound-tonish", entonces no está optimizando prematuramente según los estándares de Knuth, incluso si está utilizando un goto
para acelerar un ciclo crítico (algo que es poco probable para ayudar mucho contra los optimizadores actuales, pero si lo hiciera, y en un área realmente crítica, entonces no estaría optimizando prematuramente). Si realmente está aplicando lo que está haciendo en áreas que son realmente necesarias y ellos realmente se benefician de ello, entonces lo está haciendo muy bien a los ojos de Knuth.