Clause

Benchmarks

Clause comparado con Erlang/OTP en una misma máquina: los mismos programas Erlang, compilados con erlc y con clau -O2, miden el tiempo de sus kernels tras una llamada de calentamiento. Estas cifras cambian con cada optimización.

Media geométrica de los tiempos de los kernels, Clause -O2 frente al JIT de BEAM (OTP)
1,49× más rápido de media
Kernels en los que Clause es más rápido
31 / 31
Media geométrica el 2026-10-12, la primera ejecución registrada
20,2×

Tiempos de los kernels

Mediana de 3 ejecuciones en milisegundos. La barra muestra el tiempo de Clause dividido por el de OTP en escala logarítmica.

Clause más rápidoOTP más rápido🔺 Las ejecuciones variaron más de la mitad de la mediana.
KernelOTP JITClause -O2Clause ÷ OTP
Generación de datos
bigint_factorialCalcula el factorial de 3000 con enteros grandes, 330 veces1620,17212,760,13×
binary_appendAñade 10 000 enteros de 32 bits a un binary creciente, 23 000 veces1080,93802,570,74×
list_of_tuplesConstruye una lista de 200 000 tuplas pequeñas, 260 veces1467,601128,440,77×
list_to_tupleConvierte listas de 1000 elementos en tuplas, 170 000 veces1586,381278,690,81×
map_putInserta 2000 claves enteras en un map, una a una, 4900 veces1605,841519,510,95×
string_buildConstruye 20 000 cadenas a partir de enteros y átomos, 1000 veces1044,38720,730,69×
Procesamiento de datos
binary_matchSuma 20 000 enteros de 32 bits extraídos de un binary, 49 000 veces1272,631071,470,84×
comprehensionComprehension que filtra y duplica 20 000 enteros, 15 000 veces1407,08893,850,64×
int_to_listConvierte 20 000 enteros en cadenas y de vuelta, 2000 veces908,70412,790,45×
map_foldlAplica map y luego fold a 20 000 enteros, 4500 veces1500,771113,040,74×
map_updateIncrementa cada valor de un map de 500 claves, 24 000 veces1151,28669,970,58×
small_mapActualiza 80 millones de veces un map de estado pequeño1486,441061,830,71×
sortOrdena una lista de 20 000 enteros aleatorios, 600 veces1112,37466,550,42×
term_to_binaryCodifica y decodifica un término anidado grande, 4300 veces1433,291071,950,75×
E/S de archivos
large_readLee un archivo de 16 MB en bloques de 64 KB, 370 veces1444,151007,930,70×
large_writeEscribe un archivo de 16 MB en bloques de 64 KB, 200 veces1019,80989,090,97×
read_fileLee un archivo entero de 16 MB en una sola llamada, 330 veces1485,521483,031,00×
read_lineLee línea a línea un archivo de texto de 20 000 líneas, 52 veces1522,071467,280,96×
small_filesEscribe, relee y borra 500 archivos pequeños, 11 veces1209,751116,400,92×
Recolección de basura
explicit_collectFuerza la recolección de basura con 10 000 tuplas vivas, 5100 veces1547,98639,850,41×
grow_shrinkHace crecer el heap con una lista de 200 000 elementos y la suelta, 300 veces1041,41861,750,83×
long_lived_churnMantiene una ventana deslizante de 10 000 elementos vivos entre basura, 370 veces1351,271095,820,81×
short_processesLanza 5000 procesos efímeros que generan basura cada uno, 69 veces1667,281037,980,62×
Bibliotecas
qlcEjecuta la transformación de qlc sobre 27 consultas y 3 módulos, 11 veces1873,721714,660,92×
Paso de mensajes
fan_in100 procesos envían 1000 mensajes cada uno a uno solo, 25 veces1402,68391,780,28×
large_messageEnvía una lista de 100 000 elementos a otro proceso y de vuelta, 560 veces1063,94789,040,74×
ping_pongRebota un mensaje entre dos procesos 2 millones de veces1504,97904,200,60×
ringPasa un testigo 3050 vueltas por un anillo de 1000 procesos1438,211099,660,76×
Sockets de loopback
tcp_connectAbre 900 conexiones TCP en loopback con eco de 25 mensajes de 1 KB en cada una1418,851047,850,74×
tcp_echoHace eco de 30 000 mensajes de 1 KB por TCP en loopback1455,621136,060,78×
udp_round_tripRebota un datagrama de 1 KB 27 900 veces por UDP en loopback1458,071196,820,82×

Programas completos

Tiempo real en segundos, incluido el arranque, mediana de las ejecuciones.

ProgramaOTP JITClause -O2Clause ÷ OTP
bench_datagenConstruye en masa listas, tuplas, maps, binaries y enteros grandes8,545,720,67×
bench_dataprocOrdenación, fold, actualización de maps, matching de binaries y conversiones10,456,760,65×
bench_fileEscritura y lectura de archivos pequeños y grandes, lectura por líneas6,956,240,90×
bench_gcProcesos efímeros, heap que crece y encoge, datos vivos5,833,690,63×
bench_libraryLa parse transform de qlc en tiempo de ejecución, como la usa qlc:q/12,301,890,82×
bench_msgPing-pong, fan-in, anillo de procesos y copia de mensajes grandes5,693,280,58×
bench_socketEco TCP, conexiones TCP e idas y vueltas UDP en loopback5,994,570,76×

Progreso

Media geométrica del tiempo de Clause dividido por el de OTP en cada día con ejecuciones registradas. Las ejecuciones anteriores al 2026-10-21 no estaban fijadas a un conjunto de CPU, por lo que parte del cambio de ese día se debe a la fijación.

FechaCommitClause ÷ OTP
2026-10-12a7bc0c9b20,2×
2026-10-138a244d9c16,9×
2026-10-1455f42a9d16,9×
2026-10-156ed3851c2,73×
2026-10-1697295c841,95×
2026-10-17a8c3f8f61,38×
2026-10-18336caea71,41×
2026-10-207d7a2f2e1,00×
2026-10-2171ec52f80,78×
2026-10-23dea685080,69×
2026-10-24af1050430,65×
2026-10-26d6eafa720,71×
2026-10-30f4e5f3e00,67×

Tamaño de los ejecutables

Tamaño en megabytes de los programas de prueba tal como Clause los compila en cada nivel de optimización.

Programa-O0-O2-O2 --lto
bench_datagen9,90 MB9,82 MB9,82 MB
bench_dataproc10,42 MB10,01 MB10,01 MB
bench_file11,34 MB10,59 MB10,59 MB
bench_gc9,89 MB9,81 MB9,81 MB
bench_library10,24 MB9,94 MB9,95 MB
bench_msg9,91 MB9,82 MB9,82 MB
bench_socket11,58 MB10,64 MB10,65 MB

Tamaños con -O2 de las últimas 6 ejecuciones de benchmarks, de la más antigua a la más reciente, un commit de Clause por ejecución. La tabla siguiente añade el total de todos los programas bench_* y el tamaño del compilador clau.

024681012 MBbench_datagen, 2026-10-20 7d7a2f2e: 6,29 MBbench_datagen, 2026-10-21 71ec52f8: 6,32 MBbench_datagen, 2026-10-23 dea68508: 6,33 MBbench_datagen, 2026-10-24 af105043: 6,33 MBbench_datagen, 2026-10-26 d6eafa72: 8,55 MBbench_datagen, 2026-10-30 f4e5f3e0: 9,82 MB9.82bench_datagenbench_dataproc, 2026-10-20 7d7a2f2e: 6,62 MBbench_dataproc, 2026-10-21 71ec52f8: 6,64 MBbench_dataproc, 2026-10-23 dea68508: 6,65 MBbench_dataproc, 2026-10-24 af105043: 6,65 MBbench_dataproc, 2026-10-26 d6eafa72: 8,74 MBbench_dataproc, 2026-10-30 f4e5f3e0: 10,01 MB10.01bench_dataprocbench_file, 2026-10-20 7d7a2f2e: 6,72 MBbench_file, 2026-10-21 71ec52f8: 6,75 MBbench_file, 2026-10-23 dea68508: 6,75 MBbench_file, 2026-10-24 af105043: 6,75 MBbench_file, 2026-10-26 d6eafa72: 9,20 MBbench_file, 2026-10-30 f4e5f3e0: 10,59 MB10.59bench_filebench_gc, 2026-10-20 7d7a2f2e: 6,28 MBbench_gc, 2026-10-21 71ec52f8: 6,32 MBbench_gc, 2026-10-23 dea68508: 6,32 MBbench_gc, 2026-10-24 af105043: 6,32 MBbench_gc, 2026-10-26 d6eafa72: 8,54 MBbench_gc, 2026-10-30 f4e5f3e0: 9,81 MB9.81bench_gcbench_library, 2026-10-26 d6eafa72: 9,30 MBbench_library, 2026-10-30 f4e5f3e0: 9,94 MB9.94bench_librarybench_msg, 2026-10-20 7d7a2f2e: 6,29 MBbench_msg, 2026-10-21 71ec52f8: 6,32 MBbench_msg, 2026-10-23 dea68508: 6,33 MBbench_msg, 2026-10-24 af105043: 6,33 MBbench_msg, 2026-10-26 d6eafa72: 8,55 MBbench_msg, 2026-10-30 f4e5f3e0: 9,82 MB9.82bench_msgbench_socket, 2026-10-20 7d7a2f2e: 6,39 MBbench_socket, 2026-10-21 71ec52f8: 6,42 MBbench_socket, 2026-10-23 dea68508: 6,43 MBbench_socket, 2026-10-24 af105043: 6,43 MBbench_socket, 2026-10-26 d6eafa72: 9,33 MBbench_socket, 2026-10-30 f4e5f3e0: 10,64 MB10.64bench_socket
  • 2026-10-207d7a2f2e
  • 2026-10-2171ec52f8
  • 2026-10-23dea68508
  • 2026-10-24af105043
  • 2026-10-26d6eafa72
  • 2026-10-30f4e5f3e0
FechaCommitTodos los programas bench_*clau
2026-10-207d7a2f2e38,59 MB59,50 MB
2026-10-2171ec52f838,78 MB59,54 MB
2026-10-23dea6850838,79 MB59,54 MB
2026-10-24af10504338,81 MB59,65 MB
2026-10-26d6eafa7262,21 MB59,98 MB
2026-10-30f4e5f3e070,63 MB60,75 MB

Configuración

Máquina
Intel64 Family 6 Model 183 Stepping 1, GenuineIntel, 32 CPU lógicas, Windows 11 (10.0.26200)
Conjunto de CPU
Núcleos de rendimiento 0-15, 16 de 32 CPU lógicas
Erlang/OTP
29, ERTS 17.1
Commit de Clause
f4e5f3e0
Ejecución
2026-10-30

OTP y Clause se ejecutan en las mismas CPU: cada programa de benchmark está fijado a los núcleos de rendimiento del procesador, de modo que en una CPU híbrida ningún kernel acaba en un núcleo de eficiencia más lento. Ambos mantienen un planificador activo por cada CPU del conjunto, sin vincularlo a ninguna CPU concreta dentro de él.

Para ejecutar los benchmarks, use make benchmark o make-benchmark.bat en el repositorio de Clause; las notas de benchmarks describen los programas y las opciones. Notas de benchmarks