Des chiffres avec leurs conditions.
Builds Release sur un Intel i7-6700 (Skylake, AVX2, 4 cœurs) : Windows x64 avec MSVC 19.51 et Linux x64 sous WSL2 avec GCC 15.2. Certaines mesures de référence plus anciennes ont été relevées avec MSVC 19.44 et GCC 13.3, et le README de chaque module indique son compilateur. Les chiffres sont des médianes ou le meilleur de plusieurs exécutions, comme l'indique chaque README. Quand deux valeurs sont indiquées, Windows vient en premier. Quand une seule est indiquée, la ligne précise la plateforme.
Débit
Latence
| Opération | Module | Mesuré |
|---|---|---|
| Émettre un signal sans écouteur | event | 0.54 ns |
| Tick d'ordonnanceur à vide, horloge déjà lue | scheduler | 1.97 / 0.71 ns |
| Rechercher un message traduit | i18n | 1.4 à 2.6 ns |
| Propriétés Unicode d'un point de code | text | 2.2 / 2.6 ns |
| Lecture de configuration par handle | config | 3.52 ns |
| Incrémenter un compteur de télémétrie | telemetry | 4.88 à 4.98 ns |
| Changement de fibre brut, Windows | coroutine | 16 à 18 ns |
| Lire l'horloge monotone | time | 18.75 / 22.00 ns |
| Armer un timer quand un million sont actifs | time | 20 à 23 ns |
| Appel RPC unaire, transport nul, Windows | rpc | 617 à 714 ns |
| Ouvrir un stockage clé-valeur de 1 GB après une fermeture propre | storage | 1.49 / 0.92 ms |
Face aux références
Regex vs std::regex. 10× à 351× plus rapide que libstdc++ sur six motifs sur sept (8× sur le septième), 1.3× à 42× plus rapide que celle de MSVC, en temps linéaire. std::regex tourne sur 512 KB du même texte de 2 MB, et le résultat est mis à l'échelle.
Formatage d'entiers vs snprintf. 5.4× plus rapide. Par ailleurs, le writer de terminal transforme 100,000 écritures d'un octet vers /dev/null en 25 appels write.
Recherche vectorielle vs hnswlib 0.8. SIFT1M, un thread, Linux : recall@10 de 0.9633 contre 0.9634 à débit comparable (4,485 à 5,663 contre 4,624 requêtes/s), index construit en 478 s contre 525 s.
Maths AVX2 vs scalaire. Normalisation par lots en structure de tableaux, 512 points en L1 : 8.1× / 9.0× par rapport au chemin scalaire, compilé sans auto-vectorisation. Chaque chemin renvoie les mêmes bits, sans contraction FMA.
Vérifiée face à du code que nous n'avons pas écrit.
| Quoi | Vérifié face à | Résultat |
|---|---|---|
| Ed25519 | OpenSSL, une référence Python en entiers exacts et les vecteurs de la RFC 8032 | 11,848 · 0 divergence |
| SHA-384/512, HMAC, HKDF, AES-GCM | Python cryptography 46 et hashlib sur OpenSSL 3.5, plus 47 vecteurs officiels | 127,502 · 0 divergence |
| X25519, P-256, P-384, vérification RSA | les mêmes oracles et les RFC 7748 et 6979 | 59,001 · 0 divergence |
| X.509 | openssl verify et Python cryptography, chaînes aléatoires | 23,643 |
| TLS 1.3 | Trace RFC 8448, openssl s_server et s_client, Python ssl | 31 cas · 0 échec |
| Compression | liblz4, zlib et libxxhash, sous Linux | 79,864 · 0 divergence |
| Unicode 18 | les fichiers de conformité Unicode officiels | 100% |
| Machine learning | scikit-learn, LightGBM, XGBoost, ONNX Runtime, hnswlib, scipy | à 1e-4 près ou au bit près, et le recall de hnswlib |
| Télémétrie | un vrai Prometheus et un vrai OpenTelemetry Collector | acceptée, aucun rejet |
| Build | Tests |
|---|---|
| Windows x64, MSVC 19.51, Release | 282 sur 282 |
| Linux x64, GCC 15.2, Release | 284 sur 284 |
| Linux x64, Guard et ML activés | 287 sur 287 |
| Linux x64, ASan et UBSan | 274 · au propre, 17 oct. |
| Linux x64, TSan | 274 sur 274 · au propre, 17 oct. |
Des scripts de mutation introduisent le bug et exigent que le test casse. C'est ainsi qu'une clé d'obfuscation qui s'annulait elle-même et un cas de falsification Ed25519 ont été détectés alors que tous les tests d'aller-retour passaient.
Un projet séparé est compilé avec le SDK empaqueté via find_package, comme le fait un client. Chaque header public compile seul, sur MSVC et GCC.
MSVC /W4 et GCC -Wall -Wextra, y compris les arbres des sanitizers.
Où elle tourne, dit clairement.
24 objectifs pas encore atteints. Pour l'instant.
Chaque module a sa propre spécification avec des objectifs de performance. Voici ceux que ses mesures n'ont pas atteints, tels que consignés dans la documentation du module. Nous préférons que vous les lisiez ici plutôt que de les découvrir en production.
| Module | Mesuré par rapport à l'objectif |
|---|---|
| coroutine | Fibre vs thread : 16x à 28x moins coûteuse. Objectif de 50x non atteint |
| coroutine | Lancement d'une tâche : 80 à 250 ns. Objectif de 100 ns non atteint de façon constante |
| resilience | Chaîne de quatre politiques : 101 à 123 ns. Objectif de 50 ns non atteint |
| cache | Lecture avec succès de cache : 20.7 ns. Objectif de 20 ns non atteint |
| cache | Débit de lecture de 1 à 8 threads : 2x. Objectif de 10x de 1 à 16 threads non atteint (4 cœurs physiques) |
| compression | Bloc LZ4, texte : compresse à 365 et 380 MB/s, contre 391.2 MB/s pour la référence LZ4_compress_default sur la même machine. Objectif de 600 MB/s non atteint. Décompresse à 3.24 GB/s sous Windows et 2.48 GB/s sous Linux (l'objectif de 3 GB/s n'est atteint que sous Windows) |
| compression | CRC32 (polynôme IEEE), table slice-by-8 : 1.57 GB/s sous Windows et 2.38 GB/s sous Linux. Objectif de 20 GB/s non atteint : l'instruction x86 CRC32 ne calcule que CRC32C, qui l'atteint |
| encoding | Validation UTF-8, texte mixte : 6.7 GB/s avec AVX2. Objectif de 15 GB/s non atteint |
| config | Débit du parseur, fichier de 0.59 MB (MSVC 19.51, i7-6700) : 133 MB/s. Objectif de 200 MB/s non atteint |
| storage | Lecture ponctuelle aléatoire sur une base de 115 MB, plus grande que le cache du CPU : 831 à 1578 ns et 870 à 1176 ns. Objectif de 1 µs non atteint de façon robuste |
| regex | Face à std::regex, 7 motifs sur 2 MB : 10x à 351x vs libstdc++ sur six des sept, 1.3x à 42x vs MSVC. Objectif de 10x sur tous non atteint |
| regex | Compilation d'un motif : 1.0x à 2.2x la vitesse de std::regex sur GCC, 0.2x à 0.7x sur MSVC. Objectif de 10x plus rapide non atteint |
| rpc | Allocations par appel : 1. Objectif de zéro non atteint |
| bench | Répétabilité sur 10 exécutions : 0.4% à 14.1% et 1.3% à 14.1%. Objectif de 2% non atteint sur cette machine |
| math | Produit scalaire et vectoriel sur points entrelacés : 2.7x et 1.9x à 2.2x, distance entrelacée 2.8x sur MSVC. Objectif de 3x à 4x non atteint (les variantes en structure de tableaux atteignent 4.1x à 4.8x) |
| ecs | Itération sur 1 million avec 3 composants : 4.19 ms, au plafond de bande passante mémoire (14.3 GB/s). Objectif de 1 ms non atteint |
| Ml::Trees | Une prédiction avec 500 arbres : 12 à 14 µs avec AVX2. Objectif de 50 ns non atteint (le plancher mémoire est de 4 à 5 µs) |
| Ml::Trees | Vérification complète d'un modèle de 100 MB : environ 13 ms. Objectif de 5 ms non atteint |
| Ml::Trees | Prédiction par lots : 1.5x à 1.65x plus rapide par ligne qu'une à la fois. Objectif de 4x non atteint |
| Ml::Trees | Mode compilé : 2.7x plus lent que l'interpréteur AVX2. Objectif de 2x plus rapide non atteint |
| Ml::Features | Un événement avec 50 features : 0.45 µs avec une entité, 1.8 µs avec 10,000. Objectif de 100 ns non atteint |
| Ml::Anomaly | Autoencodeur : la feature qui contribue le plus est la responsable dans 94.3% des cas. L'objectif de 95% fixé pour les autres détecteurs n'est pas atteint |
| ModelGuard | Vérifier et déchiffrer 50 MB : environ 330 à 380 ms. Objectif de 10 ms non atteint |
| VectorIndex | Objectif de 10,000 requêtes/s à 95% de recall sur 1M x 768 non atteint |
Mesurez-le sur votre propre machine.
Le banc de mesure est livré avec la bibliothèque. Mesurez votre propre charge de travail pendant vos 30 jours d'évaluation.