"Vale la pena" necesita contexto, por ejemplo, cuánto más simple es escribir, leer y mantener frente a cuánto más rápido hace que el usuario tenga algo más receptivo, interactivo y requiere menos tiempo para que espere.
Ahorrar unos centavos para comprar una lata de refresco no me hará mucho bien si tengo que viajar una distancia para ahorrar esos centavos, especialmente dado que rara vez bebo refrescos en estos días. Ahorrar unos centavos por lata en una compra de un millón de latas de refresco podría ser un gran problema.
Mientras tanto, ahorro unos centavos cuando dos personas están justo a mi lado y una ofrece exactamente lo mismo por unos centavos más baratos y la otra no, y elijo la más cara porque me gusta más su sombrero parece un caso tonto de pesimismo.
Lo que a menudo encuentro que las personas que llaman "microoptimizaciones" parecen estar curiosamente desprovistas de mediciones, contexto y discusión sobre el usuario final, cuando debería haber absolutamente los tres para considerar tales optimizaciones si no son triviales de aplicar. Para mí, una microoptimización adecuada en estos días se relaciona con cosas como diseños de memoria y patrones de acceso, y aunque pueden parecer "micro" en foco, no son micro en efecto.
Logré, no hace mucho tiempo, reducir una operación de 24 segundos a 25 milisegundos (aproximadamente 960 veces más rápido), con salidas idénticas (aseguradas por pruebas automatizadas), sin cambios en la complejidad algorítmica, para el revestimiento de difusión de calor volumétrico, a través de "micro-optimizaciones" (la mayor de las cuales provino de un cambio en el diseño de la memoria que lo redujo a unos 2 segundos, luego el resto fueron cosas como SIMD y análisis adicionales de errores de caché en VTune y algunos cambios en el diseño de la memoria).
Wolfire explica la técnica aquí, y luchó con el tiempo requerido:
http://blog.wolfire.com/2009/11/volumetric-heat-diffusion-skinning/
Mi implementación logró hacerlo en milisegundos mientras luchaba por reducirlo a menos de un minuto:
Después de "microoptimizarlo" de 24 segundos a 25 ms, eso cambió el juego en el flujo de trabajo. Ahora los artistas pueden cambiar sus plataformas en tiempo real a más de 30 FPS sin esperar 24 segundos cada vez que realicen algún pequeño cambio en su plataforma. Y eso realmente cambió todo el diseño de mi software ya que ya no necesitaba la barra de progreso y cosas de este tipo, todo se volvió interactivo. De modo que podría ser una "microoptimización" en el sentido de que todas las mejoras se produjeron sin ninguna mejora en la complejidad algorítmica, pero en efecto fue una "megaoptimización" que hizo lo que antes era un proceso doloroso y no interactivo. en uno interactivo en tiempo real que cambió por completo la forma en que trabajaban los usuarios.
Medición, requisitos del usuario final, contexto
Realmente me gustó el comentario de Robert aquí y tal vez no logré hacer el punto que quería:
Bueno, vamos. Nadie va a argumentar que este tipo de cambio no "vale la pena". Pudiste demostrar un beneficio tangible; muchas de las llamadas micro optimizaciones no pueden.
Esta es, a pesar de trabajar en un campo muy crítico para el rendimiento con requisitos a menudo en tiempo real, la única vez que considero cualquier micro-optimización que requiera salir de mi camino.
Y enfatizaría no solo las mediciones sino también el lado del usuario final. Soy un bicho raro porque llegué a mi campo actual (y anteriormente gamedev) como usuario / fan primero, desarrollador segundo. Así que nunca me entusiasmaron tanto las cosas habituales que entusiasman a los programadores como resolver acertijos técnicos; Los encontré una carga, pero los soportaría a través del sueño del usuario final que compartí con otros usuarios. Pero eso me ayudó a asegurarme de que si estaba optimizando algo, tendría un impacto real en los usuarios con beneficios reales. Es mi salvaguarda contra la micro-optimización sin rumbo.
En mi opinión, eso es realmente tan importante como el perfilador, porque tenía colegas que hicieron cosas como la subdivisión de micro-optimización de un cubo en mil millones de facetas solo para ahogarse en modelos de producción del mundo real como personajes y vehículos. Su resultado fue impresionante en cierto sentido de "demostración tecnológica", pero casi inútil para los usuarios reales, porque estaban perfilando y midiendo y comparando casos que no se alineaban con los casos de uso del mundo real. Por lo tanto, es muy importante comprender primero lo que es importante para los usuarios, ya sea aprendiendo a pensar y usar el software como tal o colaborando con ellos (idealmente ambos, pero al menos colaborar con ellos).