rendimiento

Cifras con sus condiciones.

Builds Release en un Intel i7-6700 (Skylake, AVX2, 4 núcleos): Windows x64 con MSVC 19.51 y Linux x64 en WSL2 con GCC 15.2. Algunas líneas base antiguas se registraron con MSVC 19.44 y GCC 13.3, y el README de cada módulo indica su compilador. Las cifras son medianas o el mejor de varios intentos, según indique cada README. Cuando aparecen dos cifras, Windows va primero. Cuando aparece una sola, la fila indica la plataforma.

Rendimiento de datos

CRC32Ccompression · 256 KiB24.26 / 23.0GB/s · objetivo 20
Codificación hexencoding · 64 KiB19.32 / 18.56GB/s · objetivo 12
Decodificación hexencoding · entrada de 64 KiB14.40 / 14.53GB/s · objetivo 8
Búsqueda literalregex · 1 MB, en caché14.1 / 14.4GB/s · objetivo 10
Decodificación Base64encoding · entrada de 64 KiB13.93 / 12.71GB/s · objetivo 6
Codificación Base64encoding · 64 KiB12.44 / 11.79GB/s · objetivo 8
Descompresión LZ4compression · 256 KiB de texto3.24 / 2.48GB/s · objetivo 3, no cumplido en Linux

La marca blanca de cada barra indica el objetivo propio del módulo. Los decodificadores se miden sobre los bytes de entrada. Escala: 25 GB/s.

Latencia

OperaciónMóduloMedido
Emitir una señal sin oyentesevent0.54 ns
Tick del planificador en reposo, con el reloj ya leídoscheduler1.97 / 0.71 ns
Buscar un mensaje traducidoi18n1.4 a 2.6 ns
Propiedades Unicode de un code pointtext2.2 / 2.6 ns
Lectura de config por handleconfig3.52 ns
Incrementar un contador de telemetríatelemetría4.88 a 4.98 ns
Cambio de fibra en bruto, Windowscoroutine16 a 18 ns
Leer el reloj monotónicotime18.75 / 22.00 ns
Armar un temporizador con un millón ya activostime20 a 23 ns
Llamada RPC unaria, transporte nulo, Windowsrpc617 a 714 ns
Abrir un almacén clave-valor de 1 GB tras un cierre limpiostorage1.49 / 0.92 ms

Frente a las referencias

351×

Regex vs std::regex. De 10× a 351× más rápido que libstdc++ en seis de siete patrones (8× en el séptimo), de 1.3× a 42× más rápido que el de MSVC, en tiempo lineal. std::regex se ejecuta sobre 512 KB del mismo texto de 2 MB, con el resultado escalado.

5.4×

Formateo de enteros vs snprintf. 5.4× más rápido. Aparte, el escritor de terminal convierte 100,000 escrituras de un byte en /dev/null en 25 llamadas a write.

0.9633

Búsqueda vectorial vs hnswlib 0.8. SIFT1M, un hilo, Linux: recall@10 de 0.9633 frente a 0.9634 con un rendimiento comparable (de 4,485 a 5,663 frente a 4,624 consultas/s), índice construido en 478 s frente a 525 s.

8.1×

Matemáticas AVX2 vs escalares. Normalización por lotes en estructura de arrays, 512 puntos en L1: 8.1× / 9.0× sobre la ruta escalar, que se compila sin autovectorización. Todas las rutas devuelven los mismos bits, sin contracción FMA.

verificación

Contrastado con código que no escribimos.

QuéContrastado conResultado
Ed25519OpenSSL, una referencia Python con enteros exactos y los vectores de RFC 803211,848 · 0 divergencias
SHA-384/512, HMAC, HKDF, AES-GCMPython cryptography 46 y hashlib sobre OpenSSL 3.5, más 47 vectores oficiales127,502 · 0 divergencias
X25519, P-256, P-384, verificación RSAlos mismos oráculos y RFC 7748 y 697959,001 · 0 divergencias
X.509openssl verify y Python cryptography, cadenas aleatorias23,643
TLS 1.3traza de RFC 8448, openssl s_server y s_client, Python ssl31 casos · 0 fallos
Compresiónliblz4, zlib y libxxhash, en Linux79,864 · 0 divergencias
Unicode 18los archivos de conformidad oficiales de Unicode100%
Machine learningscikit-learn, LightGBM, XGBoost, ONNX Runtime, hnswlib, scipydentro de 1e-4 o bit a bit, y el recall de hnswlib
TelemetríaPrometheus y OpenTelemetry Collector realesaceptado, sin rechazos
BuildTests
Windows x64, MSVC 19.51, Release282 de 282
Linux x64, GCC 15.2, Release284 de 284
Linux x64, Guard y ML activados287 de 287
Linux x64, ASan y UBSan274 · limpio, 17 oct
Linux x64, TSan274 de 274 · limpio, 17 oct
Defectos sembrados

Los scripts de mutación siembran el error y exigen que el test falle. Así se detectaron una clave de ofuscación que se anulaba a sí misma y un caso de falsificación Ed25519 mientras todos los tests de ida y vuelta pasaban.

Consumido desde fuera

Un proyecto aparte se compila contra el SDK empaquetado con find_package, tal como lo usa un cliente. Cada header público compila por sí solo, en MSVC y GCC.

Cero advertencias

MSVC /W4 y GCC -Wall -Wextra, incluidos los árboles con sanitizers.

plataformas

Dónde funciona, sin rodeos.

Windows x64MSVC 19.51 · /W4
verificado
Linux x64GCC 15.2 · -Wall -Wextra
verificado
macOSCódigo POSIX, nunca compilado en un Mac
aún no validado
x86, 32 bitsPreset de MSVC
aún no verificado
ARM64 · Clanghoja de ruta
aún no compilado
los objetivos fallidos

24 objetivos que no hemos alcanzado. Todavía.

Cada módulo tiene su propia especificación con objetivos de rendimiento. Estos son los que sus mediciones no alcanzaron, tal como consta en la documentación del módulo. Mejor leerlos aquí que descubrirlos en producción.

MóduloMedido frente al objetivo
coroutineFibra vs. hilo: de 16x a 28x más barata. Objetivo de 50x no cumplido
coroutineCrear una tarea: 80 a 250 ns. Objetivo de 100 ns no cumplido de forma constante
resilienceCadena de cuatro políticas: 101 a 123 ns. Objetivo de 50 ns no cumplido
cacheLectura con acierto: 20.7 ns. Objetivo de 20 ns no cumplido
cacheRendimiento de lectura de 1 a 8 hilos: 2x. Objetivo de 10x de 1 a 16 hilos no cumplido (4 núcleos físicos)
compressionBloque LZ4, texto: comprime a 365 y 380 MB/s, frente a 391.2 MB/s de la referencia LZ4_compress_default en la misma máquina. Objetivo de 600 MB/s no cumplido. Descomprime a 3.24 GB/s en Windows y 2.48 GB/s en Linux (el objetivo de 3 GB/s solo se cumple en Windows)
compressionCRC32 (polinomio IEEE), tabla slice-by-8: 1.57 GB/s en Windows y 2.38 GB/s en Linux. Objetivo de 20 GB/s no cumplido: la instrucción x86 CRC32 solo calcula CRC32C, que sí lo alcanza
encodingValidación UTF-8, texto mixto: 6.7 GB/s con AVX2. Objetivo de 15 GB/s no cumplido
configRendimiento del parser, archivo de 0.59 MB (MSVC 19.51, i7-6700): 133 MB/s. Objetivo de 200 MB/s no cumplido
storageLectura puntual aleatoria en una base de datos de 115 MB, mayor que la caché de la CPU: 831 a 1578 ns y 870 a 1176 ns. Objetivo de 1 µs no cumplido de forma robusta
regexFrente a std::regex, 7 patrones sobre 2 MB: de 10x a 351x vs. libstdc++ en seis de los siete, de 1.3x a 42x vs. MSVC. Objetivo de 10x en todos no cumplido
regexCompilar un patrón: de 1.0x a 2.2x la velocidad de std::regex en GCC, de 0.2x a 0.7x en MSVC. Objetivo de 10x más rápido no cumplido
rpcAsignaciones por llamada: 1. Objetivo de cero no cumplido
benchRepetibilidad en 10 ejecuciones: 0.4% a 14.1% y 1.3% a 14.1%. Objetivo de 2% no cumplido en esta máquina
mathProducto escalar y vectorial sobre puntos intercalados: 2.7x y de 1.9x a 2.2x, distancia intercalada 2.8x en MSVC. Objetivo de 3x a 4x no cumplido (las variantes en estructura de arrays llegan a entre 4.1x y 4.8x)
ecsIterar 1 millón con 3 componentes: 4.19 ms, en el techo del ancho de banda de memoria (14.3 GB/s). Objetivo de 1 ms no cumplido
Ml::TreesUna predicción con 500 árboles: 12 a 14 µs con AVX2. Objetivo de 50 ns no cumplido (el suelo impuesto por la memoria es de 4 a 5 µs)
Ml::TreesVerificación completa de un modelo de 100 MB: unos 13 ms. Objetivo de 5 ms no cumplido
Ml::TreesPredicción por lotes: de 1.5x a 1.65x más rápida por fila que de una en una. Objetivo de 4x no cumplido
Ml::TreesModo compilado: 2.7x más lento que el intérprete AVX2. Objetivo de 2x más rápido no cumplido
Ml::FeaturesUn evento con 50 features: 0.45 µs con una entidad, 1.8 µs con 10,000. Objetivo de 100 ns no cumplido
Ml::AnomalyAutoencoder: la feature que más contribuye es la responsable en el 94.3% de los casos. El objetivo del 95% fijado para los demás detectores no se cumple
ModelGuardVerificar y descifrar 50 MB: unos 330 a 380 ms. Objetivo de 10 ms no cumplido
VectorIndexObjetivo de 10,000 consultas/s con un recall del 95% sobre 1M x 768 no cumplido

Mídelo en tu propia máquina.

El arnés de benchmarks viene con la biblioteca. Mide tu propia carga de trabajo durante la evaluación de 30 días.

Conoce más sobre Typename Studios y sus productos