desempenho

Números com as condições à vista.

Builds Release em um Intel i7-6700 (Skylake, AVX2, 4 núcleos): Windows x64 com MSVC 19.51 e Linux x64 no WSL2 com GCC 15.2. Algumas medições de referência mais antigas foram feitas com MSVC 19.44 e GCC 13.3, e o README de cada módulo informa o compilador. Os números são medianas ou o melhor de várias execuções, conforme cada README. Quando há dois valores, o do Windows vem primeiro. Quando há só um, a linha diz qual é a plataforma.

Vazão

CRC32Ccompression · 256 KiB24,26 / 23,0GB/s · meta 20
Codificação hexencoding · 64 KiB19,32 / 18,56GB/s · meta 12
Decodificação hexencoding · entrada de 64 KiB14,40 / 14,53GB/s · meta 8
Busca literalregex · 1 MB, em cache14,1 / 14,4GB/s · meta 10
Decodificação Base64encoding · entrada de 64 KiB13,93 / 12,71GB/s · meta 6
Codificação Base64encoding · 64 KiB12,44 / 11,79GB/s · meta 8
Descompressão LZ4compression · 256 KiB de texto3,24 / 2,48GB/s · meta 3, não cumprida no Linux

O traço branco em cada barra marca a meta do próprio módulo. Os decodificadores são medidos pelos bytes de entrada. Escala: 25 GB/s.

Latência

OperaçãoMóduloMedido
Emitir um sinal sem ouvintesevent0,54 ns
Tick do scheduler ocioso, com o relógio já lidoscheduler1,97 / 0,71 ns
Buscar uma mensagem traduzidai18n1,4 a 2,6 ns
Propriedades Unicode de um code pointtext2,2 / 2,6 ns
Leitura de config por handleconfig3,52 ns
Incrementar um contador de telemetriatelemetria4,88 a 4,98 ns
Troca de fiber bruta, Windowscoroutine16 a 18 ns
Ler o relógio monotônicotime18,75 / 22,00 ns
Armar um timer com um milhão já ativostime20 a 23 ns
Chamada RPC unária, transporte nulo, Windowsrpc617 a 714 ns
Abrir um banco chave-valor de 1 GB após um fechamento limpostorage1,49 / 0,92 ms

Comparação com as referências

351×

Regex vs std::regex. De 10× a 351× mais rápido que a libstdc++ em seis de sete padrões (8× no sétimo) e de 1,3× a 42× mais rápido que a do MSVC, com tempo linear. O std::regex roda sobre 512 KB do mesmo texto de 2 MB, com o resultado ajustado na proporção.

5,4×

Formatação de inteiros vs snprintf. 5,4× mais rápido. À parte, o writer de terminal transforma 100.000 escritas de um byte em /dev/null em 25 chamadas a write.

0,9633

Busca vetorial vs hnswlib 0.8. SIFT1M, uma thread, Linux: recall@10 de 0,9633 contra 0,9634, com vazão comparável (4.485 a 5.663 contra 4.624 consultas/s). Índice construído em 478 s, contra 525 s.

8,1×

Matemática AVX2 vs escalar. Normalização em lote no layout structure-of-arrays, 512 pontos no L1: 8,1× / 9,0× sobre o caminho escalar, que é compilado sem autovetorização. Todos os caminhos devolvem os mesmos bits, sem contração FMA.

verificação

Conferido com código que não escrevemos.

ÁreaConferido comResultado
Ed25519OpenSSL, uma referência em Python com inteiros exatos e os vetores da RFC 803211.848 · 0 divergências
SHA-384/512, HMAC, HKDF, AES-GCMPython cryptography 46 e hashlib sobre OpenSSL 3.5, além de 47 vetores oficiais127.502 · 0 divergências
X25519, P-256, P-384, verificação RSAos mesmos oráculos, mais as RFC 7748 e 697959.001 · 0 divergências
X.509openssl verify e Python cryptography, com cadeias aleatórias23,643
TLS 1.3trace da RFC 8448, openssl s_server e s_client, ssl do Python31 casos · 0 falhas
Compressãoliblz4, zlib e libxxhash, no Linux79.864 · 0 divergências
Unicode 18os arquivos oficiais de conformidade do Unicode100%
Machine learningscikit-learn, LightGBM, XGBoost, ONNX Runtime, hnswlib, scipyaté 1e-4 de diferença, ou idêntico bit a bit, e o recall do hnswlib
TelemetriaPrometheus e OpenTelemetry Collector reaisaceito sem nenhuma rejeição
BuildTestes
Windows x64, MSVC 19.51, Release282 de 282
Linux x64, GCC 15.2, Release284 de 284
Linux x64, com Guard e ML ligados287 de 287
Linux x64, ASan e UBSan274 · limpo, 17 out.
Linux x64, TSan274 de 274 · limpo, 17 out.
Defeitos plantados

Scripts de mutação inserem o bug e exigem que o teste quebre. Foi assim que pegamos uma chave de ofuscação que se anulava sozinha e um caso de falsificação Ed25519, enquanto todos os testes de ida e volta passavam.

Usada de fora do projeto

Um projeto separado é compilado contra o SDK empacotado com find_package, do jeito que um cliente usa. Cada header público compila sozinho, no MSVC e no GCC.

Zero warnings

MSVC /W4 e GCC -Wall -Wextra, incluindo as árvores de build com sanitizers.

plataformas

Onde roda, sem rodeios.

Windows x64MSVC 19.51 · /W4
verificado
Linux x64GCC 15.2 · -Wall -Wextra
verificado
macOSCódigo POSIX, nunca compilado em um Mac
ainda não validado
x86, 32 bitsPreset do MSVC
ainda não verificado
ARM64 · Clangroadmap
ainda não compilado
metas não batidas

24 metas que não batemos. Ainda.

Cada módulo tem a própria especificação, com metas de desempenho. Estas são as que as medições dele não alcançaram, conforme registrado na documentação do módulo. Preferimos que você as leia aqui a descobri-las em produção.

MóduloMedido vs. meta
coroutineFiber vs. thread: de 16x a 28x mais barata. Meta de 50x não cumprida
coroutineCriação de uma tarefa: 80 a 250 ns. Meta de 100 ns não cumprida de forma consistente
resilienceCadeia de quatro políticas: 101 a 123 ns. Meta de 50 ns não cumprida
cacheLeitura com acerto: 20,7 ns. Meta de 20 ns não cumprida
cacheVazão de leitura de 1 a 8 threads: 2x. Meta de 10x de 1 a 16 threads não cumprida (4 núcleos físicos)
compressionBloco LZ4, texto: comprime a 365 e 380 MB/s, contra 391,2 MB/s da referência LZ4_compress_default na mesma máquina. Meta de 600 MB/s não cumprida. Descomprime a 3,24 GB/s no Windows e 2,48 GB/s no Linux (a meta de 3 GB/s só é cumprida no Windows)
compressionCRC32 (polinômio IEEE), tabela slice-by-8: 1,57 GB/s no Windows e 2,38 GB/s no Linux. Meta de 20 GB/s não cumprida: a instrução x86 CRC32 só calcula o CRC32C, que chega lá
encodingValidação UTF-8, texto misto: 6,7 GB/s com AVX2. Meta de 15 GB/s não cumprida
configVazão do parser, arquivo de 0,59 MB (MSVC 19.51, i7-6700): 133 MB/s. Meta de 200 MB/s não cumprida
storageLeitura pontual aleatória num banco de 115 MB, maior que o cache da CPU: 831 a 1.578 ns e 870 a 1.176 ns. Meta de 1 µs não cumprida de forma consistente
regexContra std::regex, 7 padrões sobre 2 MB: de 10x a 351x vs. libstdc++ em seis dos sete, de 1,3x a 42x vs. MSVC. Meta de 10x em todos não cumprida
regexCompilação de um padrão: 1,0x a 2,2x a velocidade do std::regex no GCC, 0,2x a 0,7x no MSVC. Meta de ser 10x mais rápido não cumprida
rpcAlocações por chamada: 1. Meta de zero não cumprida
benchRepetibilidade em 10 execuções: 0,4% a 14,1% e 1,3% a 14,1%. Meta de 2% não cumprida nesta máquina
mathProduto escalar e vetorial em pontos intercalados: 2,7x e 1,9x a 2,2x, distância intercalada 2,8x no MSVC. Meta de 3x a 4x não cumprida (as variantes structure-of-arrays chegam de 4,1x a 4,8x)
ecsIterar 1 milhão com 3 componentes: 4,19 ms, no limite da banda de memória (14,3 GB/s). Meta de 1 ms não cumprida
Ml::TreesUma predição com 500 árvores: 12 a 14 µs com AVX2. Meta de 50 ns não cumprida (o piso da memória é de 4 a 5 µs)
Ml::TreesVerificação completa de um modelo de 100 MB: cerca de 13 ms. Meta de 5 ms não cumprida
Ml::TreesPredição em lote: 1,5x a 1,65x mais rápida por linha do que uma de cada vez. Meta de 4x não cumprida
Ml::TreesModo compilado: 2,7x mais lento que o interpretador AVX2. Meta de ser 2x mais rápido não cumprida
Ml::FeaturesUm evento com 50 features: 0,45 µs com uma entidade, 1,8 µs com 10.000. Meta de 100 ns não cumprida
Ml::AnomalyAutoencoder: a feature que mais contribui é a responsável em 94,3% dos casos. A meta de 95% definida para os outros detectores não é cumprida
ModelGuardVerificar e descriptografar 50 MB: cerca de 330 a 380 ms. Meta de 10 ms não cumprida
VectorIndexMeta de 10.000 consultas/s com recall de 95% em 1M x 768 não cumprida

Meça na sua própria máquina.

O harness de benchmark vem com a biblioteca. Meça a sua própria carga de trabalho durante os 30 dias de avaliação.

Saiba mais sobre a Typename Studios e seus produtos