为什么Crystal比Ruby更快?

时间:2016-02-22 12:02:38

标签: ruby performance runtime crystal-lang

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

1 个答案:

答案 0 :(得分:37)

我想这是一个组合的东西:

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

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