Interesting that Crystal did worse than Java even on many non-GC-stress-test benchmarks. I wasn't expecting that.
Some theories as to sources of the slowness:
- The Boehm GC is so much worse that it accounts for bad performance even on benchmarks that don't stress it.
- Crystal's polymorphic calls don't use inline caches and JIT speculation so they aren't as fast as Java's.
- LLVM isn't as good at bounds check elimination as Java because C++ doesn't need it.
- The Crystal code used reference types where it normally would use value types, and Java really has a better code generator for this sort of object-oriented code.