Бенчмарки
Clause порівняно з Erlang/OTP на одній машині: ті самі програми Erlang, скомпільовані erlc і clau -O2, вимірюють час своїх ядер після розігрівального виклику. Ці числа змінюються з кожною оптимізацією.
- Середнє геометричне часу ядер, Clause -O2 порівняно з BEAM JIT (OTP)
- 1,49× швидше в середньому
- Ядра, на яких Clause швидший
- 31 / 31
- Середнє геометричне на 2026-10-12, перший записаний запуск
- 20,2×
Час ядер
Медіана 3 запусків у мілісекундах. Смуга показує відношення часу Clause до часу OTP у логарифмічній шкалі.
| Ядро | OTP JIT | Clause -O2 | Clause ÷ OTP | |
|---|---|---|---|---|
| Генерування даних | ||||
| bigint_factorialОбчислює факторіал 3000 на великих цілих, 330 разів | 1 620,17 | 212,76 | 0,13× | |
| binary_appendДописує 10 000 32-бітових цілих до зростаючого binary, 23 000 разів | 1 080,93 | 802,57 | 0,74× | |
| list_of_tuplesБудує список із 200 000 малих кортежів, 260 разів | 1 467,60 | 1 128,44 | 0,77× | |
| list_to_tupleПеретворює списки з 1000 елементів на кортежі, 170 000 разів | 1 586,38 | 1 278,69 | 0,81× | |
| map_putДодає 2000 цілих ключів до map по одному, 4900 разів | 1 605,84 | 1 519,51 | 0,95× | |
| string_buildБудує 20 000 рядків із цілих чисел і атомів, 1000 разів | 1 044,38 | 720,73 | 0,69× | |
| Обробка даних | ||||
| binary_matchСумує 20 000 32-бітових цілих, зіставлених із binary, 49 000 разів | 1 272,63 | 1 071,47 | 0,84× | |
| comprehensionComprehension, що фільтрує й подвоює 20 000 цілих, 15 000 разів | 1 407,08 | 893,85 | 0,64× | |
| int_to_listПеретворює 20 000 цілих на рядки й назад, 2000 разів | 908,70 | 412,79 | 0,45× | |
| map_foldlЗастосовує map, потім fold до 20 000 цілих, 4500 разів | 1 500,77 | 1 113,04 | 0,74× | |
| map_updateЗбільшує кожне значення map із 500 ключами, 24 000 разів | 1 151,28 | 669,97 | 0,58× | |
| small_mapОновлює малий map стану 80 мільйонів разів | 1 486,44 | 1 061,83 | 0,71× | |
| sortСортує список із 20 000 випадкових цілих, 600 разів | 1 112,37 | 466,55 | 0,42× | |
| term_to_binaryКодує й декодує великий вкладений терм, 4300 разів | 1 433,29 | 1 071,95 | 0,75× | |
| Файловий ввід-вивід | ||||
| large_readЧитає файл на 16 МБ блоками по 64 КБ, 370 разів | 1 444,15 | 1 007,93 | 0,70× | |
| large_writeЗаписує файл на 16 МБ блоками по 64 КБ, 200 разів | 1 019,80 | 989,09 | 0,97× | |
| read_fileЧитає цілий файл на 16 МБ одним викликом, 330 разів | 1 485,52 | 1 483,03 | 1,00× | |
| read_lineЧитає текстовий файл із 20 000 рядків порядково, 52 рази | 1 522,07 | 1 467,28 | 0,96× | |
| small_filesЗаписує, читає й видаляє 500 малих файлів, 11 разів | 1 209,75 | 1 116,40 | 0,92× | |
| Збирання сміття | ||||
| explicit_collectПримусово збирає сміття з 10 000 живими кортежами, 5100 разів | 1 547,98 | 639,85 | 0,41× | |
| grow_shrinkНарощує heap списком із 200 000 елементів, потім відкидає його, 300 разів | 1 041,41 | 861,75 | 0,83× | |
| long_lived_churnТримає ковзне вікно з 10 000 живих елементів серед сміття, 370 разів | 1 351,27 | 1 095,82 | 0,81× | |
| short_processesЗапускає 5000 короткоживучих процесів, кожен створює сміття, 69 разів | 1 667,28 | 1 037,98 | 0,62× | |
| Бібліотеки | ||||
| qlcВиконує перетворення qlc над 27 запитами й 3 модулями, 11 разів | 1 873,72 | 1 714,66 | 0,92× | |
| Обмін повідомленнями | ||||
| fan_in100 процесів надсилають по 1000 повідомлень одному, 25 разів | 1 402,68 | 391,78 | 0,28× | |
| large_messageНадсилає список із 100 000 елементів іншому процесу й назад, 560 разів | 1 063,94 | 789,04 | 0,74× | |
| ping_pongПерекидає одне повідомлення між двома процесами 2 мільйони разів | 1 504,97 | 904,20 | 0,60× | |
| ringПередає токен 3050 разів кільцем із 1000 процесів | 1 438,21 | 1 099,66 | 0,76× | |
| Сокети через loopback | ||||
| tcp_connectВідкриває 900 TCP-з'єднань через loopback, у кожному луна 25 повідомлень по 1 КБ | 1 418,85 | 1 047,85 | 0,74× | |
| tcp_echoВідбиває луною 30 000 повідомлень по 1 КБ через TCP на loopback | 1 455,62 | 1 136,06 | 0,78× | |
| udp_round_tripПерекидає датаграму 1 КБ 27 900 разів через UDP на loopback | 1 458,07 | 1 196,82 | 0,82× | |
Цілі програми
Реальний час у секундах разом із запуском, медіана запусків.
| Програма | OTP JIT | Clause -O2 | Clause ÷ OTP | |
|---|---|---|---|---|
| bench_datagenМасово будує списки, кортежі, maps, binaries і великі цілі | 8,54 | 5,72 | 0,67× | |
| bench_dataprocСортування, fold, оновлення map, зіставлення binary, перетворення | 10,45 | 6,76 | 0,65× | |
| bench_fileЗапис і читання малих і великих файлів, читання рядків | 6,95 | 6,24 | 0,90× | |
| bench_gcКороткоживучі процеси, зростання й стискання heap, живі дані | 5,83 | 3,69 | 0,63× | |
| bench_libraryParse transform qlc під час виконання, як її використовує qlc:q/1 | 2,30 | 1,89 | 0,82× | |
| bench_msgПінг-понг, fan-in, кільце процесів і копіювання великих повідомлень | 5,69 | 3,28 | 0,58× | |
| bench_socketTCP-луна, TCP-з'єднання та обміни UDP через loopback | 5,99 | 4,57 | 0,76× |
Поступ
Середнє геометричне відношення часу Clause до часу OTP за кожен день записаних запусків. Запуски до 2026-10-21 не були прив'язані до набору процесорів, тож частина зміни того дня походить від прив'язки.
| Дата | Коміт | 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× |
Розмір виконуваних файлів
Розмір тестових програм у мегабайтах, зібраних Clause на кожному рівні оптимізації.
| Програма | -O0 | -O2 | -O2 --lto |
|---|---|---|---|
| bench_datagen | 9,90 МБ | 9,82 МБ | 9,82 МБ |
| bench_dataproc | 10,42 МБ | 10,01 МБ | 10,01 МБ |
| bench_file | 11,34 МБ | 10,59 МБ | 10,59 МБ |
| bench_gc | 9,89 МБ | 9,81 МБ | 9,81 МБ |
| bench_library | 10,24 МБ | 9,94 МБ | 9,95 МБ |
| bench_msg | 9,91 МБ | 9,82 МБ | 9,82 МБ |
| bench_socket | 11,58 МБ | 10,64 МБ | 10,65 МБ |
Розміри з -O2 для останніх 6 запусків бенчмарків, від найстарішого, по одному коміту Clause на запуск. Таблиця нижче додає сумарний розмір усіх програм bench_* і розмір компілятора clau.
- 2026-10-207d7a2f2e
- 2026-10-2171ec52f8
- 2026-10-23dea68508
- 2026-10-24af105043
- 2026-10-26d6eafa72
- 2026-10-30f4e5f3e0
| Дата | Коміт | Усі програми bench_* | clau |
|---|---|---|---|
| 2026-10-20 | 7d7a2f2e | 38,59 МБ | 59,50 МБ |
| 2026-10-21 | 71ec52f8 | 38,78 МБ | 59,54 МБ |
| 2026-10-23 | dea68508 | 38,79 МБ | 59,54 МБ |
| 2026-10-24 | af105043 | 38,81 МБ | 59,65 МБ |
| 2026-10-26 | d6eafa72 | 62,21 МБ | 59,98 МБ |
| 2026-10-30 | f4e5f3e0 | 70,63 МБ | 60,75 МБ |
Конфігурація
- Машина
- Intel64 Family 6 Model 183 Stepping 1, GenuineIntel, Логічних процесорів: 32, Windows 11 (10.0.26200)
- Набір процесорів
- Продуктивні ядра 0-15, 16 з 32 логічних процесорів
- Erlang/OTP
- 29, ERTS 17.1
- Коміт Clause
- f4e5f3e0
- Запуск
- 2026-10-30
OTP і Clause працюють на тих самих процесорах: кожну програму бенчмарку прив'язано до продуктивних ядер процесора, тож на гібридному процесорі жодне ядро бенчмарку (kernel) не потрапляє на повільніше енергоефективне ядро. Обидва тримають активним один планувальник на кожен процесор набору, не прив'язуючи його до конкретного процесора в межах набору.
Щоб запустити бенчмарки самостійно, виконайте make benchmark або make-benchmark.bat у репозиторії Clause; нотатки про бенчмарки описують програми та параметри. Нотатки про бенчмарки
Clause