为什么 Crystal 比 Ruby 快?

Why is Crystal faster than Ruby?

我非常想知道究竟是什么让 Crystal 比 Ruby 更快,而代码却如此相似。简短的回答可能是它是编译的,Ruby 是解释的,但我想了解更多关于语言规范的信息。

我想这是多种因素的结合:

  • Ruby 被解释,解释器可以改进。例如,其他解释型语言,如 JS 或 Java 具有非常好的 VM 和 JIT 编译器。
  • 许多 Ruby 在运行时完成的检查,在 Crystal 中是在编译时完成的。例如,Ruby 中的一个简单方法调用在方法查找中结束。即使有缓存,它也不会打败本机函数调用。或者当 Ruby 决定根据参数的类型做不同的事情时,这些检查是在运行时完成的。在 Crystal 中,它们在编译时是已知的,因此这些检查消失了。如果没有这些检查,编译器可以内联调用并做一些非常疯狂的事情(感谢 LLVM)。或者,例如,查找实例变量是 Ruby 中的哈希查找(据我所知),而在 Crystal 中它只是内存间接和加载。
  • 在Crystal中我们尽量避免额外的内存分配。例如 to_s(io) 写入 IO 而不是将对象转换为内存中的字符串。或者我们有在堆栈上分配的固定大小数组的元组。或者您可以将类型声明为结构以避免堆分配。
  • 对 C 的调用是直接完成的,没有包装器。好吧,你可以有一个包装器,但它会被 LLVM 内联。在 Ruby 中,它总是必须首先解析 Ruby 方法。

可能还有很多原因,但它们是相关的。