Clause

Benchmarks

Clause im Vergleich mit Erlang/OTP auf einer Maschine: Dieselben Erlang-Programme, kompiliert mit erlc und mit clau -O2, messen die Laufzeit ihrer Kernels nach einem Aufwärmaufruf. Diese Zahlen ändern sich mit jeder Optimierung.

Geometrisches Mittel der Kernel-Zeiten, Clause -O2 gegenüber dem BEAM-JIT (OTP)
1,49× im Mittel schneller
Kernels, bei denen Clause schneller ist
31 / 31
Geometrisches Mittel am 2026-10-12, dem ersten erfassten Lauf
20,2×

Kernel-Zeiten

Median aus 3 Läufen in Millisekunden. Der Balken zeigt die Zeit von Clause geteilt durch die von OTP auf logarithmischer Skala.

Clause schnellerOTP schneller🔺 Die Läufe schwankten um mehr als die Hälfte des Medians.
KernelOTP JITClause -O2Clause ÷ OTP
Datenerzeugung
bigint_factorialBerechnet die Fakultät von 3000 mit großen Ganzzahlen, 330-mal1.620,17212,760,13×
binary_appendHängt 10.000 32-Bit-Ganzzahlen an ein wachsendes Binary an, 23.000-mal1.080,93802,570,74×
list_of_tuplesBaut eine Liste aus 200.000 kleinen Tupeln, 260-mal1.467,601.128,440,77×
list_to_tupleWandelt Listen mit 1000 Elementen 170.000-mal in Tupel um1.586,381.278,690,81×
map_putFügt 2000 Ganzzahlschlüssel einzeln in eine Map ein, 4900-mal1.605,841.519,510,95×
string_buildBaut 20.000 Zeichenketten aus Ganzzahlen und Atomen, 1000-mal1.044,38720,730,69×
Datenverarbeitung
binary_matchSummiert 20.000 32-Bit-Ganzzahlen, per Matching aus einem Binary, 49.000-mal1.272,631.071,470,84×
comprehensionComprehension, die 20.000 Ganzzahlen filtert und verdoppelt, 15.000-mal1.407,08893,850,64×
int_to_listWandelt 20.000 Ganzzahlen in Zeichenketten und zurück, 2000-mal908,70412,790,45×
map_foldlWendet map und dann fold auf 20.000 Ganzzahlen an, 4500-mal1.500,771.113,040,74×
map_updateErhöht jeden Wert einer Map mit 500 Schlüsseln 24.000-mal1.151,28669,970,58×
small_mapAktualisiert eine kleine Zustands-Map 80 Millionen Mal1.486,441.061,830,71×
sortSortiert eine Liste mit 20.000 zufälligen Ganzzahlen, 600-mal1.112,37466,550,42×
term_to_binaryKodiert und dekodiert einen großen verschachtelten Term, 4300-mal1.433,291.071,950,75×
Datei-I/O
large_readLiest eine 16-MB-Datei in Blöcken zu 64 KB, 370-mal1.444,151.007,930,70×
large_writeSchreibt eine 16-MB-Datei in Blöcken zu 64 KB, 200-mal1.019,80989,090,97×
read_fileLiest eine ganze 16-MB-Datei mit einem Aufruf, 330-mal1.485,521.483,031,00×
read_lineLiest eine Textdatei mit 20.000 Zeilen zeilenweise, 52-mal1.522,071.467,280,96×
small_filesSchreibt, liest und löscht 500 kleine Dateien, 11-mal1.209,751.116,400,92×
Garbage Collection
explicit_collectErzwingt Garbage Collection mit 10.000 lebenden Tupeln, 5100-mal1.547,98639,850,41×
grow_shrinkLässt den Heap mit einer 200.000-Elemente-Liste wachsen, verwirft sie, 300-mal1.041,41861,750,83×
long_lived_churnHält ein gleitendes Fenster aus 10.000 lebenden Elementen inmitten von Müll, 370-mal1.351,271.095,820,81×
short_processesStartet 5000 kurzlebige Prozesse, die jeweils Müll erzeugen, 69-mal1.667,281.037,980,62×
Bibliotheken
qlcFührt die qlc-Transformation über 27 Abfragen und 3 Module aus, 11-mal1.873,721.714,660,92×
Nachrichtenaustausch
fan_in100 Prozesse senden je 1000 Nachrichten an einen, 25-mal1.402,68391,780,28×
large_messageSendet eine Liste mit 100.000 Elementen an einen Prozess und zurück, 560-mal1.063,94789,040,74×
ping_pongSchickt eine Nachricht 2 Millionen Mal zwischen zwei Prozessen hin und her1.504,97904,200,60×
ringReicht ein Token 3050-mal durch einen Ring aus 1000 Prozessen1.438,211.099,660,76×
Loopback-Sockets
tcp_connectÖffnet 900 TCP-Verbindungen über Loopback mit je 25 Echos zu 1 KB1.418,851.047,850,74×
tcp_echoEcho von 30.000 Nachrichten zu 1 KB über Loopback-TCP1.455,621.136,060,78×
udp_round_trip27.900 UDP-Roundtrips eines 1-KB-Datagramms über Loopback1.458,071.196,820,82×

Vollständige Programme

Gesamtlaufzeit in Sekunden, einschließlich Start, Median der Läufe.

ProgrammOTP JITClause -O2Clause ÷ OTP
bench_datagenErzeugt massenhaft Listen, Tupel, Maps, Binaries und große Ganzzahlen8,545,720,67×
bench_dataprocSortieren, Folds, Map-Updates, Binary-Matching und Umwandlungen10,456,760,65×
bench_fileSchreiben und Lesen kleiner und großer Dateien, zeilenweises Lesen6,956,240,90×
bench_gcKurzlebige Prozesse, wachsender und schrumpfender Heap, lebende Daten5,833,690,63×
bench_libraryDie qlc-Parse-Transform zur Laufzeit, wie qlc:q/1 sie nutzt2,301,890,82×
bench_msgPing-Pong, Fan-in, Prozessring und Kopieren großer Nachrichten5,693,280,58×
bench_socketTCP-Echo, TCP-Verbindungsaufbau und UDP-Roundtrips über Loopback5,994,570,76×

Fortschritt

Geometrisches Mittel der Zeit von Clause geteilt durch die von OTP an jedem erfassten Lauftag. Läufe vor dem 2026-10-21 waren nicht an eine CPU-Menge gebunden; ein Teil der Änderung an diesem Tag geht daher auf die Bindung zurück.

DatumCommitClause ÷ 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×

Größe der ausführbaren Dateien

Größe der Benchmark-Programme in Megabyte, wie Clause sie auf jeder Optimierungsstufe erzeugt.

Programm-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

Größen mit -O2 der letzten 6 Benchmark-Läufe, älteste zuerst, ein Clause-Commit pro Lauf. Die Tabelle darunter ergänzt die Summe aller bench_*-Programme und die Größe des Compilers 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
DatumCommitAlle bench_*-Programmeclau
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

Testumgebung

Maschine
Intel64 Family 6 Model 183 Stepping 1, GenuineIntel, 32 logische CPUs, Windows 11 (10.0.26200)
CPU-Menge
Performance-Kerne 0-15, 16 von 32 logischen CPUs
Erlang/OTP
29, ERTS 17.1
Clause-Commit
f4e5f3e0
Lauf
2026-10-30

OTP und Clause laufen auf denselben CPUs: Jedes Benchmark-Programm ist an die Performance-Kerne des Prozessors gebunden, sodass auf einer Hybrid-CPU kein Kernel auf einem langsameren Effizienz-Kern landet. Beide halten einen Scheduler pro CPU dieser Menge online, ohne ihn innerhalb der Menge an eine bestimmte CPU zu binden.

Um die Benchmarks selbst auszuführen, make benchmark oder make-benchmark.bat im Clause-Repository verwenden; die Benchmark-Notizen beschreiben die Programme und Optionen. Benchmark-Notizen