Crystal VS Java benchmarks

Current benchmark data was generated on Mon Apr 14 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 461ms 12ms 574.0MB 563ms 83ms openjdk 21
java 2.java 480ms 4.7ms 624.4MB 600ms 97ms openjdk 23
java 2-m.java 481ms 6.8ms 642.9MB 670ms 120ms graal/jvm 17.0.8
java 2.java 1174ms 6.5ms 1067.3MB 593ms 750ms openjdk/zgc 21
crystal 1.cr 1247ms 8.3ms 64.0MB 1223ms 13ms crystal 1.16.0

Input: 15

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 107ms 2.4ms 10.9MB 97ms 0ms crystal 1.16.0
java 2.java 125ms 2.4ms 165.6MB 157ms 30ms openjdk 21
java 2.java 135ms 5.3ms 96.2MB 173ms 27ms openjdk 23
java 2-m.java 150ms 5.9ms 224.4MB 227ms 53ms graal/jvm 17.0.8
java 2.java 304ms 2.2ms 241.6MB 157ms 203ms 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 1555ms 17ms 19.8MB 1483ms 60ms crystal 1.16.0
java 1-m.java 2190ms 231ms 262.9MB 8233ms 147ms openjdk 21
java 1-m.java 2460ms 195ms 242.5MB 9323ms 150ms openjdk 23
java 1-m.java 2832ms 160ms 1240.0MB 9087ms 1107ms openjdk/zgc 21

Input: 1000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 86ms 2.7ms 7.0MB 67ms 10ms crystal 1.16.0
java 1-m.java 447ms 11ms 94.5MB 1460ms 67ms openjdk 23
java 1-m.java 509ms 45ms 129.8MB 1697ms 60ms openjdk 21
java 1-m.java 673ms 33ms 223.7MB 1810ms 260ms openjdk/zgc 21

edigits

Input: 250001

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 59ms 0.2ms 6.4MB 40ms 3ms crystal 1.16.0
java 1-m.java 602ms 20ms 252.0MB 1633ms 80ms openjdk 23
java 1-m.java 610ms 7.7ms 359.7MB 1183ms 103ms graal/jvm 17.0.8
java 1-m.java 655ms 49ms 272.1MB 1740ms 67ms openjdk 21
java 1-m.java 974ms 35ms 534.3MB 1660ms 427ms openjdk/zgc 21

Input: 100000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 23ms 1.2ms 5.1MB 10ms 0ms crystal 1.16.0
java 1-m.java 302ms 9.7ms 225.8MB 597ms 70ms graal/jvm 17.0.8
java 1-m.java 359ms 29ms 177.5MB 990ms 50ms openjdk 21
java 1-m.java 391ms 36ms 126.0MB 1060ms 57ms openjdk 23
java 1-m.java 540ms 11ms 215.3MB 1083ms 223ms 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 911ms 6.0ms 96.1MB 3347ms 33ms graal/jvm 17.0.8
java 1-m.java 953ms 33ms 48.3MB 3547ms 20ms openjdk 21
java 1-m.java 980ms 19ms 51.0MB 3597ms 23ms openjdk 23
java 1-m.java 1046ms 9.7ms 45.8MB 3413ms 143ms openjdk/zgc 21
crystal 1.cr 2465ms 3.2ms 2.8MB 2457ms 0ms crystal 1.16.0

Input: 10

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 1-m.java 184ms 2.3ms 48.2MB 500ms 20ms openjdk 21
java 1-m.java 197ms 4.9ms 96.2MB 543ms 40ms graal/jvm 17.0.8
java 1-m.java 199ms 6.2ms 50.0MB 510ms 23ms openjdk 23
crystal 1.cr 204ms 1.4ms 2.8MB 190ms 0ms crystal 1.16.0
java 1-m.java 312ms 5.2ms 45.8MB 507ms 143ms openjdk/zgc 21

fasta

Input: 2500000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 4.java 446ms 6.7ms 102.7MB 630ms 37ms graal/jvm 17.0.8
java 4.java 453ms 2.9ms 47.7MB 537ms 17ms openjdk 21
java 4.java 462ms 5.5ms 49.0MB 553ms 20ms openjdk 23
crystal 2.cr 553ms 1.2ms 3.5MB 453ms 87ms crystal 1.16.0
java 4.java 574ms 8.7ms 45.3MB 550ms 140ms openjdk/zgc 21
crystal 1.cr 691ms 0.8ms 14.4MB 573ms 107ms crystal 1.16.0

Input: 250000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 2.cr 61ms 0.9ms 3.5MB 40ms 10ms crystal 1.16.0
crystal 1.cr 74ms 1.6ms 4.8MB 50ms 10ms crystal 1.16.0
java 4.java 125ms 2.4ms 46.7MB 167ms 20ms openjdk 21
java 4.java 134ms 2.5ms 47.9MB 180ms 20ms openjdk 23
java 4-m.java 134ms 4.6ms 91.8MB 193ms 37ms graal/jvm 17.0.8
java 4.java 250ms 3.6ms 43.9MB 170ms 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.1ms 2.8MB 0ms 0ms crystal 1.16.0
java 1.java 63ms 1.5ms 52.7MB 70ms 20ms graal/jvm 17.0.8
java 1.java 72ms 3.3ms 44.4MB 74ms 20ms openjdk 23
java 1.java 73ms 1.7ms 43.8MB 80ms 14ms openjdk 21
java 1.java 193ms 6.2ms 43.0MB 84ms 140ms openjdk/zgc 21

http-server

Input: 3000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 2319ms 124ms 255.6MB 313ms 490ms crystal 1.16.0

Input: 500

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 1250ms 107ms 59.0MB 37ms 80ms crystal 1.16.0

lru

Input: 1000 1000000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 0-unsafe.cr 37ms 1.4ms 2.9MB 30ms 0ms crystal 1.16.0
crystal 1.cr 64ms 0.9ms 2.9MB 53ms 0ms crystal 1.16.0

Input: 1000 3000000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 0-unsafe.cr 99ms 1.1ms 2.9MB 90ms 0ms crystal 1.16.0
crystal 1.cr 185ms 0.7ms 2.9MB 173ms 0ms crystal 1.16.0

Input: 100 500000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 0-unsafe.cr 18ms 1.3ms 2.9MB 10ms 0ms crystal 1.16.0
crystal 1.cr 30ms 1.7ms 2.9MB 20ms 0ms crystal 1.16.0

mandelbrot

Input: 5000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 313ms 1.1ms 9.1MB 300ms 0ms crystal 1.16.0
java 1b.java 1159ms 21ms 54.2MB 1270ms 23ms openjdk 21
java 1b.java 1159ms 17ms 55.4MB 1260ms 27ms openjdk 23
java 1b.java 1192ms 4.2ms 109.8MB 1433ms 40ms graal/jvm 17.0.8
java 1.java 1254ms 4.6ms 136.4MB 1363ms 50ms graal/jvm 17.0.8
java 1b.java 1272ms 4.5ms 51.2MB 1250ms 143ms openjdk/zgc 21
java 1a.java 1655ms 4.3ms 55.0MB 1750ms 23ms openjdk 21
java 1a.java 1666ms 2.2ms 56.4MB 1763ms 33ms openjdk 23
java 1a.java 1688ms 10ms 102.4MB 1807ms 43ms graal/jvm 17.0.8
java 1.java 1699ms 3.2ms 254.4MB 1770ms 43ms openjdk 21
java 1.java 1720ms 3.4ms 336.0MB 1787ms 50ms openjdk 23
java 1a.java 1779ms 9.0ms 51.4MB 1753ms 150ms openjdk/zgc 21
java 1.java 2354ms 1.7ms 859.1MB 1800ms 657ms openjdk/zgc 21
java 2.java timeout 0.0ms 744.5MB 5260ms 140ms openjdk 21
java 2.java timeout 0.0ms 818.4MB 5390ms 137ms openjdk 23
java 2.java timeout 0.0ms 3364.6MB 3493ms 1890ms openjdk/zgc 21

Input: 1000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 17ms 0.4ms 6.3MB 10ms 0ms crystal 1.16.0
java 1b-m.java 179ms 8.2ms 51.3MB 267ms 23ms openjdk 23
java 1-m.java 192ms 1.2ms 81.6MB 270ms 27ms openjdk 21
java 1a-m.java 194ms 6.6ms 51.0MB 300ms 20ms openjdk 21
java 1b-m.java 198ms 17ms 49.5MB 313ms 23ms openjdk 21
java 1.java 201ms 9.8ms 87.3MB 270ms 30ms openjdk 23
java 1a-m.java 202ms 6.2ms 52.6MB 310ms 23ms openjdk 23
java 1-m.java 207ms 12ms 114.4MB 320ms 43ms graal/jvm 17.0.8
java 1a-m.java 207ms 6.5ms 98.8MB 313ms 40ms graal/jvm 17.0.8
java 1b-m.java 244ms 39ms 103.4MB 420ms 43ms graal/jvm 17.0.8
java 1a.java 315ms 5.7ms 47.9MB 297ms 143ms openjdk/zgc 21
java 1b.java 320ms 12ms 48.0MB 320ms 140ms openjdk/zgc 21
java 1.java 337ms 2.0ms 114.6MB 270ms 170ms openjdk/zgc 21
java 2-m.java 551ms 14ms 629.1MB 833ms 87ms openjdk 21
java 2-m.java 605ms 19ms 809.9MB 897ms 120ms openjdk 23
java 2.java 1587ms 1.4ms 1374.8MB 860ms 1043ms openjdk/zgc 21

merkletrees

Input: 17

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 1.java 413ms 2.5ms 537.5MB 517ms 87ms openjdk 23
java 1.java 423ms 5.1ms 677.8MB 480ms 113ms openjdk 21
java 1-m.java 427ms 10ms 641.7MB 603ms 127ms graal/jvm 17.0.8
crystal 1.cr 843ms 7.3ms 64.0MB 823ms 10ms crystal 1.16.0
java 1.java 1047ms 30ms 965.9MB 463ms 723ms openjdk/zgc 21

Input: 15

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 1-m.java 171ms 3.8ms 206.1MB 240ms 50ms openjdk 21
java 1-m.java 171ms 0.9ms 158.6MB 250ms 43ms openjdk 23
crystal 1.cr 174ms 5.4ms 22.1MB 157ms 0ms crystal 1.16.0
java 1-m.java 215ms 11ms 253.5MB 353ms 63ms graal/jvm 17.0.8
java 1.java 424ms 13ms 341.9MB 223ms 283ms openjdk/zgc 21

nbody

Input: 5000000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 344ms 0.9ms 3.1MB 333ms 0ms crystal 1.16.0
crystal 2.cr 344ms 2.7ms 3.1MB 333ms 0ms crystal 1.16.0
java 1.java 449ms 6.5ms 81.4MB 477ms 30ms graal/jvm 17.0.8
java 1.java 451ms 0.4ms 48.3MB 487ms 17ms openjdk 23
java 1.java 457ms 15ms 45.3MB 490ms 17ms openjdk 21
java 1.java 571ms 1.4ms 44.9MB 493ms 137ms openjdk/zgc 21
java 2.java 1260ms 11ms 640.1MB 1390ms 87ms openjdk 21
java 2.java 1275ms 9.1ms 826.3MB 1380ms 123ms openjdk 23
java 2.java 3279ms 125ms 2446.0MB 1647ms 1853ms openjdk/zgc 21

Input: 500000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 2.cr 37ms 0.6ms 3.1MB 30ms 0ms crystal 1.16.0
crystal 1.cr 39ms 0.7ms 3.3MB 30ms 0ms crystal 1.16.0
java 1.java 118ms 2.8ms 81.5MB 143ms 30ms graal/jvm 17.0.8
java 1.java 123ms 2.0ms 45.2MB 163ms 20ms openjdk 21
java 1.java 124ms 4.2ms 48.2MB 157ms 20ms openjdk 23
java 1.java 251ms 4.1ms 44.9MB 173ms 140ms openjdk/zgc 21
java 2-m.java 305ms 5.3ms 394.5MB 447ms 60ms openjdk 21
java 2-m.java 328ms 5.1ms 392.1MB 470ms 70ms openjdk 23
java 2.java 687ms 2.7ms 524.4MB 477ms 407ms openjdk/zgc 21

nsieve

Input: 12

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 2.cr 298ms 3.7ms 8.1MB 287ms 0ms crystal 1.16.0
crystal 1.cr 425ms 7.5ms 62.4MB 410ms 0ms crystal 1.16.0
java 1.java 431ms 12ms 115.9MB 483ms 23ms openjdk 21
java 1.java 477ms 33ms 118.4MB 523ms 27ms openjdk 23
java 1-m.java 620ms 8.0ms 218.4MB 897ms 63ms graal/jvm 17.0.8
java 1.java 625ms 9.3ms 112.7MB 537ms 163ms openjdk/zgc 21
java 2.java 782ms 2.9ms 56.8MB 840ms 17ms openjdk 21
java 2.java 801ms 16ms 60.2MB 853ms 20ms openjdk 23
java 2.java 850ms 3.1ms 53.3MB 780ms 147ms openjdk/zgc 21
java 2-m.java 1327ms 5.9ms 242.0MB 2380ms 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 74ms 1.4ms 4.4MB 67ms 0ms crystal 1.16.0
crystal 1.cr 88ms 0.8ms 13.0MB 80ms 0ms crystal 1.16.0
java 1.java 154ms 3.2ms 64.7MB 203ms 20ms openjdk 21
java 1.java 160ms 4.0ms 68.3MB 207ms 20ms openjdk 23
java 1-m.java 205ms 7.0ms 124.6MB 293ms 37ms graal/jvm 17.0.8
java 2.java 265ms 1.0ms 49.9MB 323ms 27ms openjdk 21
java 2.java 271ms 2.5ms 50.6MB 327ms 23ms openjdk 23
java 1.java 288ms 1.8ms 61.5MB 213ms 147ms openjdk/zgc 21
java 2.java 374ms 4.3ms 47.6MB 313ms 143ms openjdk/zgc 21
java 2-m.java 478ms 6.0ms 149.5MB 853ms 60ms 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 1901ms 45ms 6.2MB 1870ms 17ms crystal 1.16.0
java 1.java 3224ms 1.3ms 443.5MB 3647ms 100ms graal/jvm 17.0.8
java 1.java 3724ms 86ms 425.6MB 4620ms 100ms openjdk 21
java 1.java 3773ms 21ms 441.7MB 4677ms 123ms openjdk 23
java 1.java timeout 0.0ms 1810.6MB 4800ms 1133ms openjdk/zgc 21

Input: 4000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 438ms 9.9ms 5.1MB 423ms 0ms crystal 1.16.0
java 1.java 896ms 7.7ms 441.5MB 1250ms 83ms graal/jvm 17.0.8
java 1-m.java 1025ms 8.5ms 437.3MB 1870ms 107ms openjdk 23
java 1-m.java 1037ms 25ms 375.5MB 1830ms 100ms openjdk 21
java 1.java 2051ms 1.9ms 1354.1MB 1723ms 1100ms 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 1996ms 8.8ms 47.7MB 7623ms 27ms openjdk 21
java 2-m.java 2011ms 5.1ms 48.3MB 7643ms 27ms openjdk 23
java 2-m.java 2140ms 20ms 45.4MB 7653ms 150ms openjdk/zgc 21
java 2-m.java 2509ms 8.6ms 94.2MB 9357ms 43ms graal/jvm 17.0.8
crystal 1.cr 3762ms 7.2ms 4.5MB 3753ms 0ms crystal 1.16.0

Input: 4000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
java 2-m.java 607ms 5.8ms 47.6MB 2140ms 23ms openjdk 21
java 2-m.java 621ms 7.5ms 48.9MB 2170ms 23ms openjdk 23
java 2-m.java 743ms 7.4ms 45.4MB 2183ms 143ms openjdk/zgc 21
java 2-m.java 769ms 3.8ms 95.1MB 2703ms 37ms graal/jvm 17.0.8
crystal 1.cr 950ms 9.5ms 4.3MB 940ms 0ms crystal 1.16.0

Input: 2000

lang code time stddev peak-mem mem time(user) time(sys) compiler compiler/runtime
crystal 1.cr 240ms 2.6ms 3.8MB 233ms 0ms crystal 1.16.0
java 2-m.java 248ms 3.4ms 47.9MB 757ms 17ms openjdk 21
java 2-m.java 270ms 8.8ms 48.8MB 790ms 27ms openjdk 23
java 2-m.java 321ms 25ms 94.1MB 983ms 40ms graal/jvm 17.0.8
java 2-m.java 400ms 6.1ms 45.6MB 820ms 153ms openjdk/zgc 21