4 mil millones de sentencias if
- Mientras revisaba recientemente las redes sociales, encontré esta captura de pantalla en un tren.
- Este código es un ejemplo perfecto del intercambio entre tiempo y memoria.
- Quise implementarlo en C para mejorar el rendimiento.
Estructura del código
- Se escribió código en C para determinar si un número es par o impar.
- Se compiló con las optimizaciones desactivadas.
- Funciona correctamente para los números del 0 al 10, pero aparecen problemas con números mayores.
Metaprogramación
- Se usó Python para hacer metaprogramación de sentencias
if.
- Se generó un programa que determina si enteros de 8 bits son pares o impares.
Extensión a 16 bits
- Se amplió el programa del mismo modo para enteros de 16 bits.
- Se generó y compiló un archivo C de aproximadamente 130k líneas.
Desafío de 32 bits
- Se intentó ampliar el programa para enteros de 32 bits.
- Se generó un archivo C de 330 GB, pero el compilador falló por falta de espacio en el heap.
- Debido a las limitaciones del formato Portable Executable, no fue posible procesar archivos de más de 4 GB.
Escritura directa de código máquina
- Se escribió directamente la función
IsEven en lenguaje ensamblador x86-64.
- Se usó Python para compilar manualmente el código máquina.
Generación del ejecutable
- Se generó un archivo de 40 GB que determina si todos los enteros de 32 bits son pares o impares.
- Se mapeó el archivo en memoria y se ejecutó el código usando un puntero a función.
Corrección final del bug
- Se reemplazó por la función
strtoul para resolver el problema al parsear enteros sin signo.
- El programa es muy rápido y devuelve resultados en menos de 10 segundos incluso para números muy grandes.
Opinión de GN⁺
- Importancia: Este artículo ayuda a entender el intercambio entre tiempo y memoria, un concepto básico de la programación. También es un buen caso para mostrar cómo el código no optimizado afecta el rendimiento real.
- Interés: Resulta interesante el proceso de explorar experimentalmente las diferencias de rendimiento entre lenguajes de programación y los límites de los compiladores. En particular, es divertida la comparación entre Python y C en el intento de mejorar el rendimiento.
- Lección: Este artículo muestra que, para resolver problemas complejos, a veces enfoques que parecen ineficientes pueden ser útiles en la práctica. También destaca la importancia de buscar soluciones creativas en ciencias de la computación.
1 comentarios
Comentarios de Hacker News
Resumen del primer comentario:
Resumen del segundo comentario:
Resumen del tercer comentario:
is-eveneis-odd.npm installse descargaría un paquete de 40 GB.Resumen del cuarto comentario:
Resumen del quinto comentario:
Resumen del sexto comentario:
Resumen del séptimo comentario:
Resumen del octavo comentario:
Resumen del noveno comentario:
libdivide.Resumen del décimo comentario: