Prestandatester
Clause jämfört med Erlang/OTP på en och samma maskin: samma Erlang-program, kompilerade med erlc och med clau -O2, tar tid på sina kärnor efter ett uppvärmningsanrop. Siffrorna ändras med varje optimering.
- Geometriskt medelvärde av kärntiderna, Clause -O2 mot BEAM JIT (OTP)
- 1,49× snabbare i genomsnitt
- Kärnor där Clause är snabbare
- 31 / 31
- Geometriskt medelvärde den 2026-10-12, den första registrerade körningen
- 20,2×
Tider per kärna
Median av 3 körningar i millisekunder. Stapeln visar Clauses tid delad med OTP:s på en logaritmisk skala.
| Kärna | OTP JIT | Clause -O2 | Clause ÷ OTP | |
|---|---|---|---|---|
| Datagenerering | ||||
| bigint_factorialBeräknar fakulteten av 3000 med stora heltal, 330 gånger | 1 620,17 | 212,76 | 0,13× | |
| binary_appendLägger till 10 000 32-bitars heltal i en växande binary, 23 000 gånger | 1 080,93 | 802,57 | 0,74× | |
| list_of_tuplesBygger en lista med 200 000 små tupler, 260 gånger | 1 467,60 | 1 128,44 | 0,77× | |
| list_to_tupleGör om listor med 1000 element till tupler, 170 000 gånger | 1 586,38 | 1 278,69 | 0,81× | |
| map_putLägger in 2000 heltalsnycklar i en map, en i taget, 4900 gånger | 1 605,84 | 1 519,51 | 0,95× | |
| string_buildBygger 20 000 strängar av heltal och atomer, 1000 gånger | 1 044,38 | 720,73 | 0,69× | |
| Databearbetning | ||||
| binary_matchSummerar 20 000 32-bitars heltal matchade ur en binary, 49 000 gånger | 1 272,63 | 1 071,47 | 0,84× | |
| comprehensionComprehension som filtrerar och dubblar 20 000 heltal, 15 000 gånger | 1 407,08 | 893,85 | 0,64× | |
| int_to_listGör om 20 000 heltal till strängar och tillbaka, 2000 gånger | 908,70 | 412,79 | 0,45× | |
| map_foldlKör map och sedan fold över 20 000 heltal, 4500 gånger | 1 500,77 | 1 113,04 | 0,74× | |
| map_updateÖkar varje värde i en map med 500 nycklar, 24 000 gånger | 1 151,28 | 669,97 | 0,58× | |
| small_mapUppdaterar en liten tillståndsmap 80 miljoner gånger | 1 486,44 | 1 061,83 | 0,71× | |
| sortSorterar en lista med 20 000 slumpmässiga heltal, 600 gånger | 1 112,37 | 466,55 | 0,42× | |
| term_to_binaryKodar och avkodar en stor nästlad term, 4300 gånger | 1 433,29 | 1 071,95 | 0,75× | |
| Fil-I/O | ||||
| large_readLäser en fil på 16 MB i block om 64 KB, 370 gånger | 1 444,15 | 1 007,93 | 0,70× | |
| large_writeSkriver en fil på 16 MB i block om 64 KB, 200 gånger | 1 019,80 | 989,09 | 0,97× | |
| read_fileLäser en hel fil på 16 MB i ett anrop, 330 gånger | 1 485,52 | 1 483,03 | 1,00× | |
| read_lineLäser en textfil med 20 000 rader rad för rad, 52 gånger | 1 522,07 | 1 467,28 | 0,96× | |
| small_filesSkriver, läser tillbaka och raderar 500 små filer, 11 gånger | 1 209,75 | 1 116,40 | 0,92× | |
| Skräpsamling | ||||
| explicit_collectTvingar fram skräpsamling med 10 000 levande tupler, 5100 gånger | 1 547,98 | 639,85 | 0,41× | |
| grow_shrinkVäxer heapen med en lista på 200 000 element och släpper den, 300 gånger | 1 041,41 | 861,75 | 0,83× | |
| long_lived_churnBehåller ett glidande fönster med 10 000 levande element bland skräp, 370 gånger | 1 351,27 | 1 095,82 | 0,81× | |
| short_processesStartar 5000 kortlivade processer som var och en skapar skräp, 69 gånger | 1 667,28 | 1 037,98 | 0,62× | |
| Bibliotek | ||||
| qlcKör qlc-transformen över 27 frågor och 3 moduler, 11 gånger | 1 873,72 | 1 714,66 | 0,92× | |
| Meddelandeöverföring | ||||
| fan_in100 processer skickar var och en 1000 meddelanden till en, 25 gånger | 1 402,68 | 391,78 | 0,28× | |
| large_messageSkickar en lista med 100 000 element till en process och tillbaka, 560 gånger | 1 063,94 | 789,04 | 0,74× | |
| ping_pongStudsar ett meddelande mellan två processer 2 miljoner gånger | 1 504,97 | 904,20 | 0,60× | |
| ringSkickar en token 3050 varv runt en ring av 1000 processer | 1 438,21 | 1 099,66 | 0,76× | |
| Loopback-sockets | ||||
| tcp_connectÖppnar 900 TCP-anslutningar via loopback och ekar 25 meddelanden på 1 KB i varje | 1 418,85 | 1 047,85 | 0,74× | |
| tcp_echoEkar 30 000 meddelanden på 1 KB över TCP via loopback | 1 455,62 | 1 136,06 | 0,78× | |
| udp_round_tripStudsar ett datagram på 1 KB 27 900 gånger över UDP via loopback | 1 458,07 | 1 196,82 | 0,82× | |
Hela program
Verklig tid i sekunder, inklusive uppstart, median av körningarna.
| Program | OTP JIT | Clause -O2 | Clause ÷ OTP | |
|---|---|---|---|---|
| bench_datagenBygger listor, tupler, maps, binaries och stora heltal i mängd | 8,54 | 5,72 | 0,67× | |
| bench_dataprocSortering, fold, map-uppdateringar, binary-matchning och konverteringar | 10,45 | 6,76 | 0,65× | |
| bench_fileSkriver och läser små och stora filer, läser rader | 6,95 | 6,24 | 0,90× | |
| bench_gcKortlivade processer, heap som växer och krymper, levande data | 5,83 | 3,69 | 0,63× | |
| bench_libraryqlc:s parse transform vid körning, som qlc:q/1 använder den | 2,30 | 1,89 | 0,82× | |
| bench_msgPing-pong, fan-in, processring och kopiering av stora meddelanden | 5,69 | 3,28 | 0,58× | |
| bench_socketTCP-eko, TCP-anslutningar och UDP-rundturer via loopback | 5,99 | 4,57 | 0,76× |
Utveckling
Geometriskt medelvärde av Clauses tid delad med OTP:s för varje dag med registrerade körningar. Körningar före 2026-10-21 var inte låsta till en processoruppsättning, så en del av förändringen den dagen kommer från låsningen.
| Datum | Commit | Clause ÷ OTP |
|---|---|---|
| 2026-10-12 | a7bc0c9b | 20,2× |
| 2026-10-13 | 8a244d9c | 16,9× |
| 2026-10-14 | 55f42a9d | 16,9× |
| 2026-10-15 | 6ed3851c | 2,73× |
| 2026-10-16 | 97295c84 | 1,95× |
| 2026-10-17 | a8c3f8f6 | 1,38× |
| 2026-10-18 | 336caea7 | 1,41× |
| 2026-10-20 | 7d7a2f2e | 1,00× |
| 2026-10-21 | 71ec52f8 | 0,78× |
| 2026-10-23 | dea68508 | 0,69× |
| 2026-10-24 | af105043 | 0,65× |
| 2026-10-26 | d6eafa72 | 0,71× |
| 2026-10-30 | f4e5f3e0 | 0,67× |
Storlek på körbara filer
Storlek i megabyte på testprogrammen som Clause bygger dem på varje optimeringsnivå.
| Program | -O0 | -O2 | -O2 --lto |
|---|---|---|---|
| bench_datagen | 9,90 MB | 9,82 MB | 9,82 MB |
| bench_dataproc | 10,42 MB | 10,01 MB | 10,01 MB |
| bench_file | 11,34 MB | 10,59 MB | 10,59 MB |
| bench_gc | 9,89 MB | 9,81 MB | 9,81 MB |
| bench_library | 10,24 MB | 9,94 MB | 9,95 MB |
| bench_msg | 9,91 MB | 9,82 MB | 9,82 MB |
| bench_socket | 11,58 MB | 10,64 MB | 10,65 MB |
Storlekar med -O2 för de senaste 6 benchmarkkörningarna, äldst först, en Clause-commit per körning. Tabellen nedan lägger till summan för alla bench_*-program och storleken på kompilatorn clau.
- 2026-10-207d7a2f2e
- 2026-10-2171ec52f8
- 2026-10-23dea68508
- 2026-10-24af105043
- 2026-10-26d6eafa72
- 2026-10-30f4e5f3e0
| Datum | Commit | Alla bench_*-program | clau |
|---|---|---|---|
| 2026-10-20 | 7d7a2f2e | 38,59 MB | 59,50 MB |
| 2026-10-21 | 71ec52f8 | 38,78 MB | 59,54 MB |
| 2026-10-23 | dea68508 | 38,79 MB | 59,54 MB |
| 2026-10-24 | af105043 | 38,81 MB | 59,65 MB |
| 2026-10-26 | d6eafa72 | 62,21 MB | 59,98 MB |
| 2026-10-30 | f4e5f3e0 | 70,63 MB | 60,75 MB |
Testmiljö
- Maskin
- Intel64 Family 6 Model 183 Stepping 1, GenuineIntel, 32 logiska processorer, Windows 11 (10.0.26200)
- Processoruppsättning
- Prestandakärnor 0-15, 16 av 32 logiska processorer
- Erlang/OTP
- 29, ERTS 17.1
- Clause-commit
- f4e5f3e0
- Körning
- 2026-10-30
OTP och Clause körs på samma processorer: varje benchmarkprogram är låst till processorns prestandakärnor, så på en hybridprocessor hamnar ingen kärna (kernel) på en långsammare effektivitetskärna. Båda håller en schemaläggare aktiv per processor i uppsättningen, obunden inom den.
Kör prestandatesterna själv med make benchmark eller make-benchmark.bat i Clause-repositoryt; anteckningarna om prestandatester beskriver programmen och alternativen. Anteckningar om prestandatester
Clause