Según Wikipedia, la regla 90/10 de optimización de programas establece que "el 90% del tiempo de ejecución de un programa se gasta en la ejecución del 10% del código" (vea el segundo párrafo aquí ).
Realmente no entiendo esto. ¿Qué significa esto exactamente? ¿Cómo puede gastarse el 90% del tiempo de ejecución solo ejecutando el 10% del código? ¿Qué pasa con el otro 90% del código entonces? ¿Cómo se pueden ejecutar en solo el 10% del tiempo?
optimization
theory
program
Rakshith Ravi
fuente
fuente
a++; for(i=0;i<100;i++){b++;} for(i=0;i<100;i++){print(xyz);}
. Claro que el primer ciclo for gasta mucho más que la primera instrucción, pero el segundo ciclo for gasta ~ 1000 veces más tiempo que el primer ciclo for, pero no se ejecuta . La gasta esperando la impresión . Entonces, hay una diferencia entre el tiempo dedicado a la ejecución y el tiempo del que es responsable el código .Respuestas:
Aquí hay dos principios básicos en juego:
La regla 90/10 no es literalmente cierta. Varía según el programa (y dudo que haya alguna base para los números específicos 90 y 10; alguien probablemente los sacó de la nada). Pero el punto es que si necesita que su programa se ejecute más rápido, probablemente solo un pequeño número de líneas es importante para que eso suceda. Identificar las partes lentas de su software es a menudo la mayor parte de la optimización.
Esta es una idea importante, y significa que las decisiones que parecen contradictorias para un nuevo desarrollador a menudo pueden ser correctas. Por ejemplo:
fuente
Esta no es una ley de la naturaleza, sino una regla general nacida de una amplia experiencia. También se conoce como la regla 80/20, y solo es una aproximación aproximada.
Bucles, ramas y otro control de flujo.
Cada lugar que tenga un if, tendrá una rama que se toma con más frecuencia que la otra rama. Por lo tanto, se pasa más tiempo de ejecución ejecutando esa parte del programa, y no la otra parte.
Cada lugar que tiene un bucle que se ejecuta más de una vez, tiene un código que se ejecuta más que el código circundante. Por lo tanto, se pasa más tiempo allí.
Como ejemplo, considere:
Aquí
print("Oh No!")
solo se ejecutará un máximo de una vez, y a menudo nunca, mientrasDoWork(i)
que ocurrirá aproximadamente un millón de veces.fuente
Bucles.
Estoy tentado de parar allí! :-)
Considera este programa
La línea 1 se ejecuta una vez, mientras que la línea 3 se ejecuta 10 veces. Mirando cada línea por turno
Dos líneas representan el 83% del tiempo de ejecución (suponiendo que todas las líneas tarden aproximadamente el mismo tiempo en ejecutarse. Por lo tanto, el 40% del programa toma> 80%.
Con ejemplos más grandes y del mundo real, esto aumenta, por lo que solo una pequeña cantidad de líneas representa gran parte del tiempo de ejecución.
La regla 90/10 (o como a veces se pone 80/20) es una "regla de oro", solo aproximadamente cierta.
Ver también Principio de Pareto
fuente
Como preguntó solo sobre el tiempo de ejecución, este ejemplo podría ser útil:
Si es un poco más serio, significa que en el código de la vida real casi siempre se llama una función pesada en un bucle (en lugar de
sleep(90);
), mientras que el resto del 10% del tiempo realiza algunos cálculos de un solo paso.Otro ejemplo es el manejo de errores en algunos servicios de alta disponibilidad. Cualquier servicio de alta disponibilidad está diseñado para trabajar una cantidad de tiempo infinita en condiciones normales. Funciona normalmente el 99% del tiempo, pero ocasionalmente, en caso de error, ejecuta un manejo y recuperación de errores, que puede ser aún más lógicamente complejo que el servicio en sí.
fuente
El razonamiento 90/10 significa que una pequeña parte de su código se repetirá o usará más que otros. Esto se usa a menudo para sugerir que debe concentrar el 90% de su esfuerzo de desarrollo / optimización en este 10% de su código.
Piense en un procesador de texto normal, como Microsoft Word u OpenOffice :
Este dicho también se usa en las ciencias de gestión ... Esta es una lección para la vida misma ... Significado: concentra la mayor parte de tus esfuerzos donde obtengas más resultados.
fuente
Imagina un programa como este:
Observe cómo hay 11 líneas aquí, donde 3 de las 11 son el ciclo for, ¿cuánto tiempo se dedica a este pequeño código? Bastante mientras las otras 8 líneas simplemente imprimen un solo carácter. Por lo tanto, tenga en cuenta que si bien algunos códigos pueden ser cortos, eso no le dice con qué frecuencia se ejecuta y cuánto tiempo llevará.
fuente
Además del bucle, como lo mencionan otras excelentes respuestas, también hay que considerar los principios DRY. Bien escrito, el código orientado a objetos tiene muchas partes reutilizables. Esas partes que se reutilizan, por definición, se usan al menos el doble de veces que algo que solo se ejecuta una vez. Si tiene una gran cantidad de código OO, podría estar reutilizando algunas clases y métodos muchas veces, y algunas otras piezas de código solo una vez.
Como se menciona en otras respuestas, probablemente sea mejor gastar esfuerzo haciendo que el código que se usa con más frecuencia sea mejor que mejorar el código que solo se usa una vez.
fuente
Esa no es una regla, es solo un tipo que editó Wikipedia con un par de números sacados de la nada y lo calificó como una regla. Compárese con el Principio de Pareto, que está más firmemente establecido en otros contextos. Me gustaría ver qué investigaciones se han realizado (si las hay) sobre la precisión de esta "regla".
Pero, básicamente, la respuesta a su pregunta es que algunos códigos se ejecutan con mucha más frecuencia que otros. Los bucles son a menudo la razón de esto. Otras razones son llamadas que requieren mucho tiempo, por ejemplo, a recursos externos como servicios web o medios de almacenamiento.
fuente
Es una reinterpretación del "principio de Pareto", que establece "para muchos eventos, aproximadamente el 80% de los efectos provienen del 20% de las causas", también conocida como la regla 80/20. Esta regla se aplica principalmente a la economía, por lo que tiene sentido que sea destinada a la programación.
Es solo un patrón que se ha observado durante un largo período de tiempo.
Aquí hay un video muy agradable sobre patrones como este, y también explica el Principio de Pareto.
https://www.youtube.com/watch?v=fCn8zs912OE&ab_channel=Vsauce
fuente