Complejidad.
Solía ser factible.
Si compra una computadora doméstica Commodore 64 vieja y escribe un programa en lenguaje máquina, entonces, para cada instrucción, se documenta exactamente cuántos ciclos de reloj requerirá. Con un recuento cuidadoso, es posible que pueda calcular exactamente cuántos ciclos de reloj requerirá todo su programa y predecir el tiempo total de ejecución hasta el microsegundo.
- Cómo hacer un diagrama de flujo y un algoritmo para convertir números binarios a decimales
- ¿Qué 'palabras' debo saber para resolver problemas de programación o problemas matemáticos relacionados?
- ¿Existe un algoritmo para aplicar a una imagen que muestre lo que vería alguien que necesita corrección de la visión?
- ¿Qué sitio web / tutorial / video puedo usar para comprender muy bien la programación dinámica en un día?
- ¿Cuál es el secreto de escribir buenos algoritmos?
Aun así, esto significaba que tenía que calcular exactamente qué secuencia de instrucciones debía procesar el programa, lo cual es difícil de hacer si el programa es complicado.
Entonces fue difícil, pero factible.
Sin embargo, lo mismo ya no es factible por muchas razones diferentes, todo lo cual hizo que la relación entre su programa y el número de ciclos de reloj utilizados para ejecutarlo sea menos transparente.
- El mismo programa se ejecuta en muchas combinaciones diferentes de componentes de hardware ahora. Su computadora contiene uno de una multitud de procesadores, placas base, conjuntos de chips y DRAM, cada uno con diferentes características de rendimiento.
- La gente ya no programa directamente en lenguaje máquina; Se utiliza un compilador para traducir su programa al lenguaje de máquina. Exactamente cómo lo hace es complicado, y hay muchos compiladores diferentes disponibles, cada uno de los cuales produce un código diferente.
- La arquitectura de la memoria se ha vuelto mucho más sofisticada. En el pasado, buscar un valor en la memoria de la computadora siempre tomaba la misma cantidad de tiempo. Ahora, el acceso secuencial es mucho más rápido que el acceso aleatorio; además, los valores se almacenan en caché, de modo que usar el mismo valor la segunda vez es mucho más rápido que la primera vez. Para empeorar las cosas, no hay un caché sino una jerarquía completa, ¡y tampoco es lo mismo en todo el hardware!
Entonces, algo que ya era difícil, pero factible, ya no se puede hacer realista, especialmente si sus conclusiones tienen que ser válidas no solo para una máquina en particular, sino para cualquier PC.
Como resultado, las personas han recurrido a probar el rendimiento del programa en la práctica.
Dicho esto, los buenos programadores a menudo todavía tienen un presentimiento decente sobre la eficiencia de un programa, basado en el análisis teórico de los algoritmos involucrados combinados con la experiencia práctica.