Java VS Crystal benchmarks

Current benchmark data was generated on Sun Jul 13 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 455ms 1.0ms 575.9MB 557ms 83ms openjdk 21
java 2-m.java 469ms 4.8ms 641.2MB 673ms 113ms graal/jvm 17.0.8
java 2.java 473ms 8.9ms 642.1MB 573ms 103ms openjdk 23
java 2.java 1191ms 22ms 1054.4MB 577ms 773ms openjdk/zgc 21
crystal 1.cr 1241ms 14ms 64.2MB 1213ms 13ms crystal 1.16.3

Input: 15

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 105ms 3.7ms 11.0MB 93ms 0ms crystal 1.16.3
java 2-m.java 125ms 0.6ms 167.1MB 157ms 33ms openjdk 21
java 2.java 129ms 5.0ms 96.0MB 167ms 27ms openjdk 23
java 2-m.java 151ms 3.3ms 227.2MB 220ms 63ms graal/jvm 17.0.8
java 2.java 305ms 2.0ms 241.5MB 157ms 197ms openjdk/zgc 21

edigits

Input: 250001

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 59ms 1.2ms 7.6MB 40ms 3ms crystal 1.16.3
java 1-m.java 555ms 15ms 273.6MB 1557ms 70ms openjdk 21
java 1-m.java 623ms 13ms 381.7MB 1183ms 123ms graal/jvm 17.0.8
java 1-m.java 641ms 58ms 267.1MB 1720ms 63ms openjdk 23
java 1-m.java 950ms 37ms 500.2MB 1577ms 403ms openjdk/zgc 21

Input: 100000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 23ms 0.9ms 5.3MB 10ms 0ms crystal 1.16.3
java 1-m.java 305ms 11ms 226.1MB 607ms 67ms graal/jvm 17.0.8
java 1-m.java 355ms 28ms 177.9MB 977ms 43ms openjdk 21
java 1-m.java 375ms 23ms 127.9MB 1017ms 50ms openjdk 23
java 1-m.java 508ms 21ms 215.5MB 1010ms 213ms 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 901ms 6.8ms 97.1MB 3320ms 40ms graal/jvm 17.0.8
java 1-m.java 983ms 3.0ms 48.4MB 3663ms 17ms openjdk 21
java 1-m.java 987ms 5.3ms 50.2MB 3643ms 20ms openjdk 23
java 1-m.java 1036ms 2.8ms 45.8MB 3383ms 143ms openjdk/zgc 21
crystal 1.cr 2476ms 14ms 2.9MB 2467ms 0ms crystal 1.16.3

Input: 10

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 1-m.java 183ms 8.1ms 48.2MB 497ms 20ms openjdk 21
java 1-m.java 188ms 2.5ms 50.3MB 487ms 23ms openjdk 23
java 1-m.java 205ms 0.3ms 95.9MB 573ms 40ms graal/jvm 17.0.8
crystal 1.cr 205ms 3.2ms 2.9MB 197ms 0ms crystal 1.16.3
java 1-m.java 299ms 1.9ms 45.9MB 493ms 137ms openjdk/zgc 21

fasta

Input: 2500000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 4.java 448ms 4.7ms 101.5MB 633ms 37ms graal/jvm 17.0.8
java 4.java 458ms 6.9ms 47.4MB 543ms 17ms openjdk 21
java 4.java 464ms 8.8ms 49.1MB 557ms 20ms openjdk 23
crystal 2.cr 534ms 3.4ms 3.6MB 443ms 73ms crystal 1.16.3
java 4.java 566ms 2.0ms 45.1MB 530ms 140ms openjdk/zgc 21
crystal 1.cr 676ms 1.2ms 14.6MB 570ms 93ms crystal 1.16.3

Input: 250000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 2.cr 57ms 1.2ms 3.5MB 40ms 3ms crystal 1.16.3
crystal 1.cr 73ms 2.0ms 4.4MB 57ms 3ms crystal 1.16.3
java 4.java 120ms 2.9ms 46.6MB 163ms 13ms openjdk 21
java 4.java 127ms 4.2ms 48.0MB 173ms 17ms openjdk 23
java 4-m.java 131ms 4.7ms 94.1MB 183ms 37ms graal/jvm 17.0.8
java 4.java 242ms 2.2ms 43.9MB 163ms 137ms 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.9MB 0ms 0ms crystal 1.16.3
java 1.java 62ms 2.2ms 52.9MB 66ms 18ms graal/jvm 17.0.8
java 1.java 67ms 7.0ms 43.8MB 74ms 18ms openjdk 21
java 1.java 71ms 5.3ms 44.7MB 74ms 16ms openjdk 23
java 1.java 193ms 7.2ms 42.8MB 82ms 136ms 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 1030ms 58ms 127.6MB 3553ms 33ms openjdk 21
java 3-m.java 1084ms 15ms 158.2MB 3720ms 43ms openjdk 23
java 3-m.java 1100ms 49ms 179.0MB 3693ms 73ms graal/jvm 17.0.8
java 3-m.java 1449ms 55ms 179.3MB 4600ms 200ms openjdk/zgc 21

Input: 250000_in

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 3-m.java 338ms 53ms 96.3MB 993ms 50ms openjdk 21
java 3-m.java 341ms 21ms 136.0MB 907ms 60ms graal/jvm 17.0.8
java 3-m.java 345ms 34ms 88.9MB 1023ms 40ms openjdk 23
java 3-m.java 426ms 6.6ms 98.2MB 890ms 170ms openjdk/zgc 21

mandelbrot

Input: 5000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 316ms 2.0ms 9.3MB 303ms 0ms crystal 1.16.3
java 1b.java 1148ms 3.6ms 54.4MB 1243ms 23ms openjdk 21
java 1b.java 1151ms 11ms 55.3MB 1253ms 23ms openjdk 23
java 1b.java 1176ms 8.9ms 104.9MB 1347ms 40ms graal/jvm 17.0.8
java 1.java 1253ms 4.6ms 134.0MB 1370ms 43ms graal/jvm 17.0.8
java 1b.java 1270ms 3.9ms 51.2MB 1247ms 143ms openjdk/zgc 21
java 1a.java 1659ms 4.1ms 56.1MB 1757ms 23ms openjdk 23
java 1a.java 1664ms 3.0ms 54.6MB 1767ms 23ms openjdk 21
java 1a.java 1682ms 5.1ms 102.5MB 1793ms 40ms graal/jvm 17.0.8
java 1.java 1699ms 4.8ms 202.4MB 1773ms 37ms openjdk 21
java 1.java 1719ms 5.3ms 339.5MB 1780ms 57ms openjdk 23
java 1a.java 1779ms 9.0ms 51.9MB 1757ms 140ms openjdk/zgc 21
java 1.java 2364ms 7.9ms 840.5MB 1793ms 677ms openjdk/zgc 21
java 2.java timeout 0.0ms 667.9MB 5287ms 113ms openjdk 21
java 2.java timeout 0.0ms 832.8MB 5270ms 133ms openjdk 23
java 2.java timeout 0.0ms 3268.7MB 3443ms 1920ms openjdk/zgc 21

Input: 1000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 17ms 0.1ms 5.8MB 10ms 0ms crystal 1.16.3
java 1b-m.java 182ms 16ms 51.0MB 290ms 20ms openjdk 23
java 1b-m.java 184ms 23ms 49.7MB 300ms 20ms openjdk 21
java 1-m.java 189ms 0.7ms 81.7MB 263ms 30ms openjdk 21
java 1-m.java 190ms 1.4ms 87.0MB 263ms 27ms openjdk 23
java 1a-m.java 190ms 0.9ms 50.8MB 293ms 17ms openjdk 21
java 1a-m.java 192ms 1.9ms 52.4MB 297ms 23ms openjdk 23
java 1-m.java 198ms 1.9ms 112.3MB 303ms 43ms graal/jvm 17.0.8
java 1a-m.java 205ms 5.5ms 98.8MB 313ms 43ms graal/jvm 17.0.8
java 1b-m.java 220ms 15ms 102.1MB 373ms 37ms graal/jvm 17.0.8
java 1a.java 311ms 2.1ms 49.0MB 293ms 137ms openjdk/zgc 21
java 1b.java 323ms 14ms 47.7MB 327ms 137ms openjdk/zgc 21
java 1.java 329ms 3.3ms 114.4MB 267ms 157ms openjdk/zgc 21
java 2-m.java 565ms 6.3ms 660.9MB 850ms 93ms openjdk 21
java 2-m.java 567ms 4.7ms 757.4MB 843ms 110ms openjdk 23
java 2.java 1585ms 8.4ms 1334.6MB 847ms 1037ms openjdk/zgc 21

merkletrees

Input: 17

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 1.java 401ms 5.9ms 544.3MB 500ms 87ms openjdk 23
java 1.java 403ms 2.1ms 680.0MB 480ms 87ms openjdk 21
java 1-m.java 444ms 62ms 669.4MB 667ms 113ms graal/jvm 17.0.8
crystal 1.cr 843ms 9.4ms 64.2MB 820ms 10ms crystal 1.16.3
java 1.java 1021ms 2.8ms 934.5MB 470ms 697ms openjdk/zgc 21

Input: 15

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 1-m.java 164ms 3.1ms 158.5MB 237ms 43ms openjdk 23
java 1-m.java 170ms 10ms 206.6MB 237ms 47ms openjdk 21
crystal 1.cr 178ms 3.9ms 22.2MB 163ms 0ms crystal 1.16.3
java 1-m.java 221ms 7.1ms 253.9MB 363ms 63ms graal/jvm 17.0.8
java 1.java 411ms 7.8ms 341.9MB 223ms 267ms openjdk/zgc 21

nbody

Input: 5000000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 2.cr 343ms 3.1ms 3.3MB 333ms 0ms crystal 1.16.3
crystal 1.cr 347ms 1.5ms 3.3MB 337ms 0ms crystal 1.16.3
java 1.java 442ms 1.0ms 45.1MB 480ms 17ms openjdk 21
java 1.java 444ms 3.9ms 48.3MB 480ms 23ms openjdk 23
java 1.java 454ms 0.5ms 81.1MB 490ms 30ms graal/jvm 17.0.8
java 1.java 563ms 6.0ms 44.7MB 483ms 133ms openjdk/zgc 21
java 2.java 1235ms 3.8ms 571.4MB 1363ms 87ms openjdk 21
java 2.java 1310ms 91ms 794.4MB 1433ms 93ms openjdk 23
java 2.java 3270ms 60ms 2461.0MB 1670ms 1817ms openjdk/zgc 21

Input: 500000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 37ms 0.6ms 3.3MB 30ms 0ms crystal 1.16.3
crystal 2.cr 38ms 0.9ms 3.3MB 30ms 0ms crystal 1.16.3
java 1.java 116ms 4.0ms 45.4MB 143ms 23ms openjdk 21
java 1.java 119ms 2.3ms 81.5MB 150ms 27ms graal/jvm 17.0.8
java 1.java 120ms 2.0ms 47.9MB 157ms 13ms openjdk 23
java 1.java 240ms 5.7ms 44.7MB 153ms 140ms openjdk/zgc 21
java 2-m.java 294ms 9.4ms 366.4MB 437ms 50ms openjdk 21
java 2-m.java 317ms 4.3ms 397.4MB 450ms 67ms openjdk 23
java 2.java 674ms 5.7ms 533.2MB 460ms 400ms openjdk/zgc 21

nsieve

Input: 12

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 2.cr 351ms 3.7ms 8.3MB 340ms 0ms crystal 1.16.3
java 1.java 390ms 0.8ms 118.4MB 430ms 23ms openjdk 23
java 1.java 391ms 5.0ms 115.1MB 447ms 23ms openjdk 21
crystal 1.cr 418ms 6.0ms 43.0MB 407ms 0ms crystal 1.16.3
java 1.java 561ms 6.7ms 112.6MB 463ms 160ms openjdk/zgc 21
java 1-m.java 626ms 57ms 271.3MB 907ms 73ms graal/jvm 17.0.8
java 2.java 779ms 2.8ms 57.2MB 837ms 23ms openjdk 21
java 2.java 783ms 1.4ms 60.2MB 830ms 20ms openjdk 23
java 2.java 853ms 0.8ms 53.3MB 780ms 147ms openjdk/zgc 21
java 2-m.java 1413ms 80ms 290.5MB 2513ms 117ms graal/jvm 17.0.8

Input: 10

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 2.cr 87ms 1.6ms 4.5MB 80ms 0ms crystal 1.16.3
crystal 1.cr 92ms 2.2ms 13.1MB 80ms 0ms crystal 1.16.3
java 1.java 152ms 2.2ms 64.8MB 200ms 20ms openjdk 21
java 1.java 154ms 3.8ms 68.1MB 203ms 20ms openjdk 23
java 1-m.java 212ms 3.8ms 133.8MB 293ms 47ms graal/jvm 17.0.8
java 2.java 262ms 8.9ms 50.3MB 310ms 20ms openjdk 23
java 2.java 263ms 4.7ms 49.3MB 330ms 20ms openjdk 21
java 1.java 278ms 4.5ms 61.5MB 197ms 143ms openjdk/zgc 21
java 2.java 368ms 3.9ms 47.5MB 307ms 143ms openjdk/zgc 21
java 2-m.java 483ms 1.9ms 140.6MB 857ms 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 1967ms 53ms 6.3MB 1943ms 13ms crystal 1.16.3
java 1.java 3212ms 15ms 444.6MB 3627ms 110ms graal/jvm 17.0.8
java 1.java 3669ms 54ms 426.1MB 4610ms 110ms openjdk 21
java 1.java 3752ms 19ms 501.5MB 4603ms 120ms openjdk 23
java 1.java timeout 0.0ms 1758.6MB 4670ms 1183ms openjdk/zgc 21

Input: 4000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 446ms 6.4ms 5.0MB 433ms 0ms crystal 1.16.3
java 1.java 896ms 13ms 444.3MB 1243ms 87ms graal/jvm 17.0.8
java 1-m.java 1001ms 28ms 353.6MB 1797ms 90ms openjdk 21
java 1-m.java 1015ms 31ms 423.3MB 1787ms 93ms openjdk 23
java 1.java 2003ms 34ms 1358.4MB 1703ms 1060ms 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.7MB 5397ms 93ms graal/jvm 17.0.8
java 3.java timeout 0.0ms 302.1MB 5333ms 53ms openjdk 21
java 3.java timeout 0.0ms 304.8MB 5320ms 67ms openjdk 23
java 3.java timeout 0.0ms 471.1MB 4957ms 303ms openjdk/zgc 21

Input: 250000_in

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 3-m.java 782ms 10ms 175.4MB 1160ms 47ms graal/jvm 17.0.8
java 3-m.java 806ms 18ms 130.9MB 1183ms 33ms openjdk 21
java 3-m.java 814ms 8.2ms 132.4MB 1230ms 30ms openjdk 23
java 3.java 963ms 9.6ms 133.9MB 1133ms 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 1988ms 6.6ms 47.8MB 7613ms 23ms openjdk 21
java 2-m.java 1996ms 1.7ms 48.5MB 7643ms 30ms openjdk 23
java 2-m.java 2127ms 4.4ms 45.5MB 7673ms 153ms openjdk/zgc 21
java 2-m.java 2508ms 27ms 94.1MB 9400ms 37ms graal/jvm 17.0.8
crystal 1.cr 3757ms 13ms 4.5MB 3747ms 0ms crystal 1.16.3

Input: 4000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 2-m.java 602ms 2.3ms 47.5MB 2150ms 17ms openjdk 21
java 2-m.java 612ms 9.6ms 48.6MB 2137ms 20ms openjdk 23
java 2-m.java 737ms 8.8ms 45.3MB 2157ms 143ms openjdk/zgc 21
java 2-m.java 761ms 18ms 94.5MB 2673ms 37ms graal/jvm 17.0.8
crystal 1.cr 948ms 9.2ms 4.4MB 937ms 0ms crystal 1.16.3

Input: 2000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 238ms 1.0ms 3.9MB 230ms 0ms crystal 1.16.3
java 2-m.java 253ms 12ms 47.6MB 770ms 17ms openjdk 21
java 2-m.java 255ms 4.3ms 48.5MB 763ms 20ms openjdk 23
java 2-m.java 328ms 5.5ms 93.3MB 1020ms 40ms graal/jvm 17.0.8
java 2-m.java 381ms 12ms 45.7MB 770ms 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 1511ms 17ms 19.9MB 1450ms 47ms crystal 1.16.3
java 1-m.java 2305ms 190ms 264.5MB 8783ms 140ms openjdk 21
java 1-m.java 2419ms 254ms 243.1MB 9207ms 137ms openjdk 23
java 1-m.java 2938ms 109ms 1226.1MB 9570ms 1070ms openjdk/zgc 21

Input: 1000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 86ms 1.4ms 7.1MB 63ms 13ms crystal 1.16.3
java 1-m.java 464ms 5.9ms 96.8MB 1527ms 67ms openjdk 23
java 1-m.java 473ms 16ms 121.6MB 1597ms 57ms openjdk 21
java 1-m.java 654ms 16ms 213.4MB 1803ms 237ms openjdk/zgc 21