prestazioni

Numeri con le loro condizioni.

Build Release su un Intel i7-6700 (Skylake, AVX2, 4 core): Windows x64 con MSVC 19.51 e Linux x64 sotto WSL2 con GCC 15.2. Alcune baseline più vecchie sono state registrate con MSVC 19.44 e GCC 13.3, e il README di ogni modulo indica il suo compilatore. I valori sono mediane o il migliore di più esecuzioni, come indica ogni README. Dove compaiono due numeri, Windows viene per primo. Dove ne compare uno solo, la riga indica la piattaforma.

Throughput

CRC32Ccompression · 256 KiB24.26 / 23.0GB/s · obiettivo 20
Codifica hexencoding · 64 KiB19.32 / 18.56GB/s · obiettivo 12
Decodifica hexencoding · input di 64 KiB14.40 / 14.53GB/s · obiettivo 8
Ricerca letteraleregex · 1 MB, in cache14.1 / 14.4GB/s · obiettivo 10
Decodifica Base64encoding · input di 64 KiB13.93 / 12.71GB/s · obiettivo 6
Codifica Base64encoding · 64 KiB12.44 / 11.79GB/s · obiettivo 8
Decompressione LZ4compression · 256 KiB di testo3.24 / 2.48GB/s · obiettivo 3, mancato su Linux

La tacca bianca su ogni barra indica l'obiettivo del modulo. I decoder sono misurati sui byte di input. Scala: 25 GB/s.

Latenza

OperazioneModuloMisurato
Emettere un segnale senza listenerevent0.54 ns
Tick dello scheduler a vuoto, con il clock già lettoscheduler1.97 / 0.71 ns
Cercare un messaggio tradottoi18nda 1.4 a 2.6 ns
Proprietà Unicode di un code pointtext2.2 / 2.6 ns
Lettura di configurazione tramite handleconfig3.52 ns
Incrementare un contatore di telemetriatelemetryda 4.88 a 4.98 ns
Cambio di fiber grezzo, Windowscoroutineda 16 a 18 ns
Leggere l'orologio monotonotime18.75 / 22.00 ns
Armare un timer con un milione attivitimeda 20 a 23 ns
Chiamata RPC unaria, trasporto nullo, Windowsrpcda 617 a 714 ns
Aprire un key-value store da 1 GB dopo una chiusura pulitastorage1.49 / 0.92 ms

Rispetto ai riferimenti

351×

Regex contro std::regex. Da 10× a 351× più veloce di libstdc++ su sei pattern su sette (8× sul settimo), da 1.3× a 42× più veloce di quella di MSVC, in tempo lineare. std::regex gira su 512 KB dello stesso testo di 2 MB, con il risultato riscalato.

5.4×

Formattazione di interi contro snprintf. 5.4× più veloce. A parte, il writer del terminale trasforma 100,000 scritture da un byte su /dev/null in 25 chiamate a write.

0.9633

Ricerca vettoriale contro hnswlib 0.8. SIFT1M, un thread, Linux: recall@10 di 0.9633 contro 0.9634 con throughput comparabile (da 4,485 a 5,663 contro 4,624 query/s), indice costruito in 478 s contro 525 s.

8.1×

Matematica AVX2 contro scalare. Normalizzazione a batch in structure-of-arrays, 512 punti in L1: 8.1× / 9.0× rispetto al percorso scalare, compilato senza autovettorizzazione. Ogni percorso restituisce gli stessi bit, senza contrazione FMA.

verifica

Confrontata con codice che non abbiamo scritto noi.

CosaConfrontato conRisultato
Ed25519OpenSSL, un riferimento Python a interi esatti e i vettori RFC 803211,848 · 0 divergenze
SHA-384/512, HMAC, HKDF, AES-GCMPython cryptography 46 e hashlib su OpenSSL 3.5, più 47 vettori ufficiali127,502 · 0 divergenze
X25519, P-256, P-384, verifica RSAgli stessi oracoli e RFC 7748 e 697959,001 · 0 divergenze
X.509openssl verify e Python cryptography, catene casuali23,643
TLS 1.3Trace RFC 8448, openssl s_server e s_client, Python ssl31 casi · 0 errori
Compressioneliblz4, zlib e libxxhash, su Linux79,864 · 0 divergenze
Unicode 18i file di conformità Unicode ufficiali100%
Machine learningscikit-learn, LightGBM, XGBoost, ONNX Runtime, hnswlib, scipyentro 1e-4 o identici al bit, e il recall di hnswlib
TelemetriaPrometheus e OpenTelemetry Collector realiaccettata, nessun rifiuto
BuildTest
Windows x64, MSVC 19.51, Release282 su 282
Linux x64, GCC 15.2, Release284 su 284
Linux x64, Guard e ML attivi287 su 287
Linux x64, ASan e UBSan274 · puliti, 17 ott
Linux x64, TSan274 su 274 · puliti, 17 ott
Difetti inseriti

Script di mutazione inseriscono il bug ed esigono che il test fallisca. Così sono stati scovati una chiave di offuscamento che si annullava da sola e un caso di falsificazione Ed25519, mentre tutti i test di round-trip passavano.

Usata dall'esterno

Un progetto separato viene compilato contro l'SDK pacchettizzato con find_package, nello stesso modo in cui lo usa un cliente. Ogni header pubblico compila da solo, su MSVC e GCC.

Zero warning

MSVC /W4 e GCC -Wall -Wextra, inclusi gli alberi dei sanitizer.

piattaforme

Dove gira, detto chiaramente.

Windows x64MSVC 19.51 · /W4
verificata
Linux x64GCC 15.2 · -Wall -Wextra
verificata
macOSCodice POSIX, mai compilato su un Mac
non ancora validata
x86, 32 bitPreset MSVC
non ancora verificata
ARM64 · Clangroadmap
non ancora compilata
gli obiettivi mancati

24 obiettivi non ancora raggiunti. Per ora.

Ogni modulo ha la sua specifica con obiettivi di prestazioni. Questi sono quelli che le sue misure non hanno raggiunto, come riportato nella documentazione del modulo. Preferiamo che tu li legga qui piuttosto che scoprirli in produzione.

ModuloMisurato rispetto all'obiettivo
coroutineFiber contro thread: da 16x a 28x meno costosa. Obiettivo di 50x non raggiunto
coroutineCreazione di un task: da 80 a 250 ns. Obiettivo di 100 ns non raggiunto con costanza
resilienceCatena di quattro policy: da 101 a 123 ns. Obiettivo di 50 ns non raggiunto
cacheLettura con hit: 20.7 ns. Obiettivo di 20 ns non raggiunto
cacheThroughput di lettura da 1 a 8 thread: 2x. Obiettivo di 10x da 1 a 16 thread non raggiunto (4 core fisici)
compressionBlocco LZ4, testo: comprime a 365 e 380 MB/s, contro 391.2 MB/s del riferimento LZ4_compress_default sulla stessa macchina. Obiettivo di 600 MB/s non raggiunto. Decomprime a 3.24 GB/s su Windows e 2.48 GB/s su Linux (l'obiettivo di 3 GB/s è raggiunto solo su Windows)
compressionCRC32 (polinomio IEEE), tabella slice-by-8: 1.57 GB/s su Windows e 2.38 GB/s su Linux. Obiettivo di 20 GB/s non raggiunto: l'istruzione x86 CRC32 calcola solo CRC32C, che lo raggiunge
encodingValidazione UTF-8, testo misto: 6.7 GB/s con AVX2. Obiettivo di 15 GB/s non raggiunto
configThroughput del parser, file da 0.59 MB (MSVC 19.51, i7-6700): 133 MB/s. Obiettivo di 200 MB/s non raggiunto
storageLettura puntuale casuale su un database di 115 MB, più grande della cache della CPU: da 831 a 1578 ns e da 870 a 1176 ns. Obiettivo di 1 µs non raggiunto in modo stabile
regexContro std::regex, 7 pattern su 2 MB: da 10x a 351x rispetto a libstdc++ su sei dei sette, da 1.3x a 42x rispetto a MSVC. Obiettivo di 10x su tutti non raggiunto
regexCompilazione di un pattern: da 1.0x a 2.2x la velocità di std::regex su GCC, da 0.2x a 0.7x su MSVC. Obiettivo di 10x più veloce non raggiunto
rpcAllocazioni per chiamata: 1. Obiettivo di zero non raggiunto
benchRipetibilità su 10 esecuzioni: da 0.4% a 14.1% e da 1.3% a 14.1%. Obiettivo del 2% non raggiunto su questa macchina
mathProdotto scalare e vettoriale su punti interleaved: 2.7x e da 1.9x a 2.2x, distanza interleaved 2.8x su MSVC. Obiettivo da 3x a 4x non raggiunto (le varianti structure-of-arrays arrivano da 4.1x a 4.8x)
ecsIterare 1 milione con 3 componenti: 4.19 ms, al limite della banda di memoria (14.3 GB/s). Obiettivo di 1 ms non raggiunto
Ml::TreesUna predizione con 500 alberi: da 12 a 14 µs con AVX2. Obiettivo di 50 ns non raggiunto (il limite imposto dalla memoria è da 4 a 5 µs)
Ml::TreesVerifica completa di un modello da 100 MB: circa 13 ms. Obiettivo di 5 ms non raggiunto
Ml::TreesPredizione a batch: da 1.5x a 1.65x più veloce per riga rispetto a una alla volta. Obiettivo di 4x non raggiunto
Ml::TreesModalità compilata: 2.7x più lenta dell'interprete AVX2. Obiettivo di 2x più veloce non raggiunto
Ml::FeaturesUn evento con 50 feature: 0.45 µs con un'entità, 1.8 µs con 10,000. Obiettivo di 100 ns non raggiunto
Ml::AnomalyAutoencoder: la feature che contribuisce di più è quella responsabile nel 94.3% dei casi. L'obiettivo del 95% fissato per gli altri rilevatori non è raggiunto
ModelGuardVerifica e decifratura di 50 MB: da circa 330 a 380 ms. Obiettivo di 10 ms non raggiunto
VectorIndexObiettivo di 10,000 query/s con recall del 95% su 1M x 768 non raggiunto

Misuralo sulla tua macchina.

L'infrastruttura di benchmark è inclusa nella libreria. Misura il tuo carico di lavoro durante la tua valutazione di 30 giorni.

Scopri di più su Typename Studios e i suoi prodotti