为什么Crystal比Ruby更快?

24

我非常想知道在代码如此相似的情况下,是什么让Crystal比Ruby更快。简短的答案可能是它被编译了,而Ruby是解释性的,然而我希望更多地了解语言规范。

1个回答

45

我想这是几个因素的综合:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接