4 milliards d’instructions if
- En parcourant récemment les réseaux sociaux, l’auteur est tombé sur cette capture d’écran dans un train.
- Ce code est un exemple parfait de compromis temps-mémoire.
- L’objectif était d’améliorer les performances en l’implémentant en C.
Structure du code
- Du code en C a été écrit pour déterminer si un nombre est pair ou impair.
- La compilation a été effectuée avec les optimisations désactivées.
- Cela fonctionne correctement pour les nombres de 0 à 10, mais pose problème au-delà.
Métaprogrammation
- Les instructions if ont été générées par métaprogrammation en Python.
- Un programme a été produit pour déterminer la parité d’entiers sur 8 bits.
Extension à 16 bits
- Le programme a été étendu de la même manière aux entiers sur 16 bits.
- Un fichier C d’environ 130k lignes a été généré puis compilé.
Défi du 32 bits
- Une tentative a été faite pour étendre le programme aux entiers sur 32 bits.
- Un fichier C de 330 Go a été généré, mais le compilateur a échoué faute d’espace heap.
- En raison des limites du format Portable Executable, il est impossible de traiter des fichiers de plus de 4 Go.
Écriture directe du code machine
- La fonction
IsEven a été écrite directement en assembleur x86-64.
- Le code machine a été compilé manuellement à l’aide de Python.
Génération de l’exécutable
- Un fichier de 40 Go a été généré pour déterminer la parité de tous les entiers 32 bits.
- Le fichier a été mappé en mémoire et le code exécuté via un pointeur de fonction.
Correction finale du bug
- La fonction
strtoul a remplacé l’ancienne approche afin de corriger le problème d’analyse des entiers non signés.
- Le programme est très rapide et renvoie un résultat en moins de 10 secondes, même pour des nombres de grande taille.
L’avis de GN⁺
- Importance : cet article aide à comprendre le compromis temps-mémoire, un concept fondamental en programmation. Il montre aussi concrètement l’impact qu’un code non optimisé peut avoir sur les performances réelles.
- Intérêt : la démarche expérimentale autour des écarts de performance entre langages et des limites du compilateur est particulièrement intéressante. La comparaison entre Python et C pour améliorer les performances est notamment amusante.
- Leçon : cet article montre qu’une approche pouvant sembler inefficace peut parfois s’avérer utile pour résoudre un problème complexe. Il souligne aussi l’importance de rechercher des solutions créatives en informatique.
1 commentaires
Avis Hacker News
Résumé du premier commentaire :
Résumé du deuxième commentaire :
Résumé du troisième commentaire :
is-evenetis-odd.npm installtélécharge un package de 40 Go.Résumé du quatrième commentaire :
Résumé du cinquième commentaire :
Résumé du sixième commentaire :
Résumé du septième commentaire :
Résumé du huitième commentaire :
Résumé du neuvième commentaire :
libdivide.Résumé du dixième commentaire :