- En compilant soi-même le paquet source de
jq fourni par Ubuntu, il est possible d’améliorer les performances jusqu’à 90 %
- Les performances sont maximisées en améliorant le compilateur, les drapeaux d’optimisation et l’allocateur mémoire
Configuration
jq est utilisé pour traiter des fichiers GeoJSON au format JSON
- Exécution d’une requête qui affiche le nom de la ville de toutes les parcelles dont la valeur dépasse un certain seuil dans la carte parcellaire de l’Alameda County Assessor, d’une taille de 500 MB
- Sur un système Ryzen 9 9950X, cela prend environ 5 secondes avec des fichiers en cache, d’où l’idée de chercher à améliorer cela
Étape 1 : reconstruire le paquet
- Téléchargement du code source de
jq depuis Launchpad, puis reconstruction sans aucun drapeau
- Résultat : 2 à 4 % d’amélioration des performances
- Résultats du benchmark
- jq compilé : moyenne de 4,517 secondes
- paquet Ubuntu par défaut : moyenne de 4,641 secondes
- amélioration des performances : 1,03× plus rapide
Étape 2 : utiliser Clang et des drapeaux d’optimisation avancés
- Compilation avec Clang-18, utilisation d’un niveau d’optimisation plus élevé et de la LTO
- Principaux drapeaux utilisés :
-O3 → niveau d’optimisation renforcé
-flto → application de la Link-Time Optimization
-DNDEBUG → exclusion du code de débogage
- Résultats du benchmark
- jq compilé : moyenne de 3,853 secondes
- paquet Ubuntu par défaut : moyenne de 4,631 secondes
- amélioration des performances : 1,20× plus rapide
Étape 3 : ajout de TCMalloc
- Utilisation de TCMalloc à la place du
malloc par défaut de GNU libc
- Compilation après ajout de
-L/usr/lib/x86_64-linux-gnu -ltcmalloc_minimal
- Résultats du benchmark
- jq compilé : moyenne de 3,253 secondes
- paquet Ubuntu par défaut : moyenne de 4,611 secondes
- amélioration des performances : 1,42× plus rapide
Étape 4 : appliquer le préchargement dynamique de TCMalloc
- Utilisation de TCMalloc via préchargement dynamique sur le paquet Ubuntu par défaut
- Résultats du benchmark
- jq par défaut : moyenne de 4,601 secondes
- jq avec TCMalloc : moyenne de 4,082 secondes
- amélioration des performances : 1,13× plus rapide
Étape 5 : tester le préchargement dynamique d’autres allocateurs
- Test de jemalloc et mimalloc, deux autres allocateurs mémoire fournis par Ubuntu
- mimalloc offre les meilleures performances
- Résultats du benchmark
- jq par défaut : moyenne de 4,123 secondes
- jq avec TCMalloc : moyenne de 4,130 secondes
- jq avec jemalloc : moyenne de 3,510 secondes
- jq avec mimalloc : moyenne de 3,154 secondes → performances améliorées de 1,31×
Étape 6 : compiler directement avec mimalloc
- Liaison statique de mimalloc au lieu d’un préchargement dynamique
- Performances maximisées
- Résultats du benchmark
- jq compilé : moyenne de 2,428 secondes
- paquet Ubuntu par défaut : moyenne de 4,606 secondes
- amélioration des performances : 1,90× plus rapide
🚀 Résultat final
- Le
jq compilé manuellement est 90 % plus rapide que le paquet Ubuntu
- Performances sur le traitement de 13 000 fichiers JSON pour un total de 2,2 GB :
- jq compilé : 0,755 seconde
- jq par défaut : 1,424 seconde
- amélioration des performances : environ 2×
1 commentaires
Commentaire Hacker News
Le titre « Reconstruire des paquets Ubuntu et changer l’allocateur mémoire pour les rendre 90 % plus rapides » ressemble à du clickbait
mallocen préchargeant jemalloc, avec des résultats positifs pour stabiliser l’utilisation mémoireL’ingénierie est l’art du compromis
Gentoo Linux est un système d’exploitation conçu pour être optimisé selon les usages spécifiques de l’utilisateur
Installer manuellement des paquets comme jq peut les exclure des mises à jour de sécurité
Utiliser un
mallocnon officiel peut entraîner des bugs étrangesEn lisant qu’un simple changement peut apporter un énorme gain de vitesse, quelqu’un veut en informer le développeur de jq
Compiler des paquets depuis les sources ou télécharger les binaires officiels peut être bénéfique
La fonction
cargo installde Rust est utile, car elle permet des optimisations adaptées à une plateforme donnéeAprès avoir changé d’allocateur mémoire, il serait possible de reconstruire des paquets Ubuntu pour les rendre 90 % plus rapides