Java VS Crystal benchmarks

Current benchmark data was generated on Tue Apr 01 2025, full log can be found HERE

CONTRIBUTIONS are WELCOME!

[x86_64][4 cores] AMD EPYC 7763 64-Core Processor (Model 1)

* -m in a file name stands for multi-threading or multi-processing

* -i in a file name stands for direct intrinsics usage. (Usage of simd intrinsics via libraries is not counted)

* -ffi in a file name stands for non-stdlib FFI usage

* (You may find time < time(user) + time(sys) for some non-parallelized programs, the overhead is from GC or JIT compiler, which are allowed to take advantage of multi-cores as that's more close to real-world scenarios.)

binarytrees

Input: 18

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 2.java 463ms 0.8ms 576.3MB 547ms 97ms openjdk 21
java 2-m.java 465ms 3.0ms 643.3MB 647ms 120ms graal/jvm 17.0.8
java 2.java 474ms 2.2ms 624.4MB 590ms 93ms openjdk 23
java 2.java 1249ms 22ms 1096.2MB 580ms 837ms openjdk/zgc 21
crystal 1.cr 1295ms 34ms 64.0MB 1273ms 10ms crystal 1.15.1

Input: 15

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 107ms 2.5ms 10.9MB 93ms 0ms crystal 1.15.1
java 2.java 126ms 3.1ms 167.2MB 157ms 30ms openjdk 21
java 2-m.java 128ms 4.5ms 98.8MB 163ms 30ms openjdk 23
java 2-m.java 149ms 6.5ms 224.4MB 223ms 57ms graal/jvm 17.0.8
java 2.java 313ms 5.1ms 241.8MB 160ms 210ms openjdk/zgc 21

edigits

Input: 250001

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 60ms 1.5ms 6.5MB 43ms 3ms crystal 1.15.1
java 1-m.java 599ms 4.3ms 354.2MB 1150ms 117ms graal/jvm 17.0.8
java 1-m.java 634ms 43ms 266.3MB 1703ms 67ms openjdk 21
java 1-m.java 657ms 59ms 261.5MB 1740ms 83ms openjdk 23
java 1-m.java 997ms 4.6ms 529.0MB 1707ms 430ms openjdk/zgc 21

Input: 100000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 22ms 0.5ms 5.0MB 10ms 0ms crystal 1.15.1
java 1-m.java 303ms 7.2ms 226.0MB 597ms 67ms graal/jvm 17.0.8
java 1-m.java 382ms 15ms 179.0MB 1037ms 57ms openjdk 21
java 1-m.java 387ms 8.5ms 111.7MB 1057ms 53ms openjdk 23
java 1-m.java 549ms 3.9ms 215.3MB 1083ms 230ms openjdk/zgc 21

fannkuch-redux

Input: 11

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 1-m.java 899ms 11ms 95.9MB 3313ms 40ms graal/jvm 17.0.8
java 1-m.java 955ms 65ms 49.0MB 3507ms 23ms openjdk 21
java 1-m.java 988ms 5.4ms 50.3MB 3637ms 27ms openjdk 23
java 1-m.java 1035ms 2.7ms 45.8MB 3383ms 150ms openjdk/zgc 21
crystal 1.cr 2504ms 1.5ms 2.8MB 2497ms 0ms crystal 1.15.1

Input: 10

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 1-m.java 177ms 4.1ms 48.6MB 473ms 27ms openjdk 21
java 1-m.java 194ms 12ms 95.8MB 533ms 37ms graal/jvm 17.0.8
java 1-m.java 199ms 4.2ms 50.1MB 520ms 23ms openjdk 23
crystal 1.cr 207ms 1.1ms 2.8MB 200ms 0ms crystal 1.15.1
java 1-m.java 310ms 7.3ms 46.1MB 520ms 140ms openjdk/zgc 21

fasta

Input: 2500000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 4-m.java 447ms 11ms 101.5MB 637ms 40ms graal/jvm 17.0.8
java 4.java 460ms 1.3ms 49.2MB 550ms 20ms openjdk 23
java 4.java 461ms 3.8ms 47.6MB 547ms 20ms openjdk 21
crystal 2.cr 556ms 1.6ms 3.4MB 453ms 90ms crystal 1.15.1
java 4.java 578ms 7.4ms 45.3MB 540ms 147ms openjdk/zgc 21
crystal 1.cr 697ms 1.0ms 14.4MB 580ms 103ms crystal 1.15.1

Input: 250000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 2.cr 60ms 1.1ms 3.5MB 43ms 7ms crystal 1.15.1
crystal 1.cr 75ms 1.3ms 4.8MB 53ms 7ms crystal 1.15.1
java 4-m.java 128ms 4.4ms 93.9MB 177ms 40ms graal/jvm 17.0.8
java 4.java 128ms 3.4ms 46.2MB 167ms 20ms openjdk 21
java 4.java 129ms 1.5ms 48.3MB 170ms 20ms openjdk 23
java 4.java 249ms 1.9ms 43.7MB 170ms 140ms openjdk/zgc 21

helloworld

Input: QwQ

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 1.9ms 0.2ms 2.8MB 0ms 0ms crystal 1.15.1
java 1.java 64ms 1.4ms 52.8MB 66ms 20ms graal/jvm 17.0.8
java 1.java 68ms 2.2ms 43.7MB 78ms 18ms openjdk 21
java 1.java 73ms 6.0ms 44.7MB 76ms 18ms openjdk 23
java 1.java 195ms 5.0ms 43.0MB 86ms 138ms openjdk/zgc 21

knucleotide

Input: 2500000_in

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 3-m.java 1046ms 62ms 129.0MB 3583ms 47ms openjdk 21
java 3-m.java 1088ms 44ms 179.5MB 3717ms 70ms graal/jvm 17.0.8
java 3-m.java 1110ms 33ms 156.5MB 3790ms 60ms openjdk 23
java 3-m.java 1433ms 34ms 179.4MB 4537ms 207ms openjdk/zgc 21

Input: 250000_in

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 3-m.java 331ms 17ms 101.3MB 940ms 47ms openjdk 21
java 3-m.java 335ms 14ms 140.0MB 907ms 60ms graal/jvm 17.0.8
java 3-m.java 346ms 6.0ms 90.5MB 1027ms 40ms openjdk 23
java 3-m.java 444ms 4.7ms 98.6MB 927ms 177ms openjdk/zgc 21

mandelbrot

Input: 5000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 314ms 1.6ms 9.2MB 300ms 0ms crystal 1.15.1
java 1b.java 1153ms 7.9ms 55.4MB 1257ms 23ms openjdk 23
java 1b.java 1157ms 8.0ms 54.2MB 1260ms 23ms openjdk 21
java 1b.java 1195ms 40ms 109.9MB 1393ms 43ms graal/jvm 17.0.8
java 1.java 1264ms 8.1ms 130.0MB 1383ms 43ms graal/jvm 17.0.8
java 1b.java 1276ms 14ms 50.9MB 1250ms 150ms openjdk/zgc 21
java 1a.java 1659ms 2.3ms 55.5MB 1753ms 27ms openjdk 23
java 1a.java 1661ms 3.2ms 55.0MB 1760ms 23ms openjdk 21
java 1a.java 1682ms 2.7ms 102.0MB 1793ms 40ms graal/jvm 17.0.8
java 1.java 1715ms 1.3ms 266.8MB 1787ms 50ms openjdk 21
java 1.java 1716ms 5.3ms 309.7MB 1780ms 53ms openjdk 23
java 1a.java 1793ms 9.1ms 51.8MB 1763ms 150ms openjdk/zgc 21
java 1.java 2387ms 4.4ms 832.3MB 1797ms 700ms openjdk/zgc 21
java 2.java timeout 0.0ms 641.9MB 5290ms 123ms openjdk 21
java 2.java timeout 0.0ms 887.3MB 5270ms 137ms openjdk 23
java 2.java timeout 0.0ms 3306.3MB 3353ms 2010ms openjdk/zgc 21

Input: 1000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 18ms 0.2ms 6.4MB 10ms 0ms crystal 1.15.1
java 1b-m.java 187ms 7.0ms 49.6MB 280ms 30ms openjdk 21
java 1b-m.java 189ms 10ms 50.5MB 293ms 27ms openjdk 23
java 1a-m.java 191ms 3.6ms 50.7MB 297ms 20ms openjdk 21
java 1a-m.java 193ms 4.4ms 51.9MB 297ms 23ms openjdk 23
java 1-m.java 195ms 11ms 110.7MB 307ms 43ms graal/jvm 17.0.8
java 1-m.java 195ms 1.4ms 81.8MB 277ms 23ms openjdk 21
java 1-m.java 196ms 11ms 86.9MB 270ms 30ms openjdk 23
java 1a-m.java 205ms 3.1ms 98.0MB 307ms 37ms graal/jvm 17.0.8
java 1b-m.java 219ms 16ms 101.9MB 370ms 40ms graal/jvm 17.0.8
java 1a.java 316ms 4.9ms 48.6MB 290ms 147ms openjdk/zgc 21
java 1b.java 319ms 1.4ms 47.6MB 310ms 143ms openjdk/zgc 21
java 1.java 339ms 4.4ms 114.3MB 273ms 163ms openjdk/zgc 21
java 2-m.java 570ms 16ms 655.1MB 853ms 93ms openjdk 21
java 2-m.java 585ms 14ms 789.4MB 853ms 123ms openjdk 23
java 2.java 1661ms 61ms 1407.9MB 860ms 1103ms openjdk/zgc 21

merkletrees

Input: 17

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 1.java 403ms 6.5ms 679.3MB 460ms 100ms openjdk 21
java 1.java 404ms 6.2ms 543.6MB 507ms 87ms openjdk 23
java 1-m.java 415ms 10ms 628.4MB 613ms 107ms graal/jvm 17.0.8
crystal 1.cr 880ms 9.8ms 64.0MB 860ms 7ms crystal 1.15.1
java 1.java 1081ms 7.3ms 969.4MB 447ms 757ms openjdk/zgc 21

Input: 15

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 164ms 2.8ms 22.1MB 147ms 0ms crystal 1.15.1
java 1-m.java 168ms 0.6ms 158.6MB 250ms 40ms openjdk 23
java 1-m.java 170ms 0.4ms 206.2MB 240ms 50ms openjdk 21
java 1-m.java 218ms 17ms 253.4MB 360ms 60ms graal/jvm 17.0.8
java 1.java 426ms 21ms 342.0MB 217ms 290ms openjdk/zgc 21

nbody

Input: 5000000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 2.cr 345ms 1.0ms 3.3MB 337ms 0ms crystal 1.15.1
crystal 1.cr 346ms 1.2ms 3.3MB 333ms 0ms crystal 1.15.1
java 1.java 448ms 1.9ms 45.3MB 487ms 20ms openjdk 21
java 1.java 448ms 1.6ms 48.3MB 480ms 20ms openjdk 23
java 1.java 449ms 6.6ms 81.5MB 477ms 30ms graal/jvm 17.0.8
java 1.java 566ms 4.0ms 44.5MB 483ms 137ms openjdk/zgc 21
java 2.java 1270ms 4.1ms 792.6MB 1393ms 103ms openjdk 23
java 2.java 1288ms 52ms 595.9MB 1420ms 83ms openjdk 21
java 2.java 3257ms 134ms 2431.0MB 1623ms 1843ms openjdk/zgc 21

Input: 500000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 2.cr 38ms 1.0ms 3.1MB 30ms 0ms crystal 1.15.1
crystal 1.cr 39ms 1.6ms 3.1MB 30ms 0ms crystal 1.15.1
java 1-m.java 119ms 1.7ms 81.7MB 147ms 33ms graal/jvm 17.0.8
java 1.java 121ms 1.4ms 45.2MB 160ms 20ms openjdk 21
java 1.java 124ms 7.2ms 48.2MB 160ms 20ms openjdk 23
java 1.java 248ms 4.1ms 44.9MB 170ms 140ms openjdk/zgc 21
java 2-m.java 301ms 9.8ms 387.1MB 443ms 53ms openjdk 21
java 2-m.java 314ms 3.1ms 416.0MB 453ms 70ms openjdk 23
java 2.java 692ms 5.9ms 525.1MB 467ms 410ms openjdk/zgc 21

nsieve

Input: 12

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 2.cr 305ms 5.0ms 8.1MB 293ms 0ms crystal 1.15.1
java 1.java 423ms 4.3ms 114.8MB 473ms 23ms openjdk 21
crystal 1.cr 425ms 1.3ms 42.3MB 410ms 0ms crystal 1.15.1
java 1.java 469ms 27ms 118.4MB 513ms 20ms openjdk 23
java 1.java 606ms 18ms 112.9MB 513ms 167ms openjdk/zgc 21
java 1-m.java 613ms 10ms 237.4MB 893ms 70ms graal/jvm 17.0.8
java 2.java 783ms 4.9ms 60.5MB 840ms 20ms openjdk 23
java 2.java 785ms 1.0ms 56.8MB 840ms 23ms openjdk 21
java 2.java 900ms 86ms 53.4MB 833ms 140ms openjdk/zgc 21
java 2-m.java 1356ms 37ms 256.2MB 2440ms 100ms graal/jvm 17.0.8

Input: 10

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 2.cr 77ms 1.5ms 4.4MB 67ms 0ms crystal 1.15.1
crystal 1.cr 91ms 3.5ms 13.0MB 83ms 0ms crystal 1.15.1
java 1.java 157ms 4.9ms 68.4MB 207ms 23ms openjdk 23
java 1.java 168ms 7.3ms 64.9MB 223ms 27ms openjdk 21
java 1-m.java 214ms 16ms 124.6MB 300ms 47ms graal/jvm 17.0.8
java 2.java 259ms 4.6ms 50.0MB 317ms 23ms openjdk 21
java 2.java 264ms 0.8ms 50.4MB 317ms 17ms openjdk 23
java 1.java 289ms 0.6ms 61.4MB 210ms 150ms openjdk/zgc 21
java 2.java 369ms 3.1ms 47.4MB 303ms 140ms openjdk/zgc 21
java 2-m.java 473ms 4.4ms 145.8MB 837ms 63ms graal/jvm 17.0.8

pidigits

Input: 8000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 1938ms 39ms 6.1MB 1910ms 13ms crystal 1.15.1
java 1.java 3228ms 17ms 443.5MB 3663ms 97ms graal/jvm 17.0.8
java 1.java 3745ms 13ms 432.2MB 4617ms 123ms openjdk 23
java 1.java 3749ms 15ms 432.6MB 4667ms 110ms openjdk 21
java 1.java timeout 0.0ms 1935.8MB 4717ms 1170ms openjdk/zgc 21

Input: 4000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 472ms 18ms 5.0MB 457ms 0ms crystal 1.15.1
java 1.java 888ms 9.3ms 445.3MB 1240ms 80ms graal/jvm 17.0.8
java 1-m.java 1037ms 26ms 352.0MB 1820ms 103ms openjdk 21
java 1-m.java 1052ms 11ms 383.3MB 1800ms 100ms openjdk 23
java 1.java 2087ms 5.4ms 1391.0MB 1783ms 1130ms openjdk/zgc 21

regex-redux

Input: 2500000_in

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 3.java timeout 0.0ms 407.6MB 5400ms 97ms graal/jvm 17.0.8
java 3.java timeout 0.0ms 302.4MB 5330ms 57ms openjdk 21
java 3.java timeout 0.0ms 304.9MB 5337ms 57ms openjdk 23
java 3.java timeout 0.0ms 467.6MB 4963ms 297ms openjdk/zgc 21

Input: 250000_in

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 3-m.java 787ms 14ms 175.2MB 1167ms 57ms graal/jvm 17.0.8
java 3-m.java 806ms 23ms 130.6MB 1207ms 40ms openjdk 21
java 3-m.java 810ms 30ms 133.1MB 1227ms 37ms openjdk 23
java 3.java 972ms 20ms 133.7MB 1177ms 177ms openjdk/zgc 21

spectral-norm

Input: 8000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 2-m.java 1997ms 10ms 47.8MB 7620ms 23ms openjdk 21
java 2-m.java 2004ms 6.8ms 48.5MB 7647ms 23ms openjdk 23
java 2-m.java 2106ms 19ms 45.5MB 7530ms 147ms openjdk/zgc 21
java 2-m.java 2510ms 37ms 95.1MB 9387ms 50ms graal/jvm 17.0.8
crystal 1.cr 3796ms 8.1ms 4.5MB 3787ms 0ms crystal 1.15.1

Input: 4000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 2-m.java 608ms 11ms 49.1MB 2147ms 23ms openjdk 23
java 2-m.java 610ms 7.9ms 47.8MB 2153ms 23ms openjdk 21
java 2-m.java 729ms 4.6ms 45.4MB 2143ms 150ms openjdk/zgc 21
java 2-m.java 762ms 11ms 93.2MB 2673ms 43ms graal/jvm 17.0.8
crystal 1.cr 953ms 3.3ms 4.3MB 940ms 0ms crystal 1.15.1

Input: 2000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 242ms 2.7ms 3.8MB 230ms 0ms crystal 1.15.1
java 2-m.java 253ms 8.5ms 48.1MB 743ms 23ms openjdk 21
java 2-m.java 267ms 10ms 48.9MB 800ms 27ms openjdk 23
java 2-m.java 298ms 25ms 94.0MB 890ms 37ms graal/jvm 17.0.8
java 2-m.java 383ms 1.6ms 45.6MB 763ms 147ms openjdk/zgc 21

coro-prime-sieve

Input: 4000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 1270ms 70ms 19.6MB 1200ms 53ms crystal 1.15.1
java 1-m.java 2369ms 239ms 257.6MB 8973ms 137ms openjdk 21
java 1-m.java 2440ms 133ms 242.6MB 9250ms 147ms openjdk 23
java 1-m.java 3165ms 194ms 1248.2MB 10320ms 1190ms openjdk/zgc 21

Input: 1000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 72ms 1.4ms 7.0MB 50ms 10ms crystal 1.15.1
java 1-m.java 474ms 13ms 92.7MB 1553ms 60ms openjdk 23
java 1-m.java 482ms 35ms 122.2MB 1600ms 70ms openjdk 21
java 1-m.java 665ms 22ms 214.5MB 1780ms 247ms openjdk/zgc 21