为什么Ruby方法调用特别慢(与其他语言相比)?

为什么Ruby方法调用特别慢(与其他语言相比)?,ruby,performance,interpreter,interpreted-language,Ruby,Performance,Interpreter,Interpreted Language,我试图阅读有关Ruby性能的文章,其中一个答案提到“方法调用,Ruby中最常见的操作之一,速度特别慢。” 提到“它对方法进行“延迟查找”,以实现灵活性。这会使它的速度减慢很多。它还必须记住每个上下文的名称,以便进行求值,因此它的帧和方法调用速度较慢。” 有人能更详细地解释为什么Ruby方法调用特别慢,并详细说明第二个线程吗?我不完全确定什么是延迟查找或者为什么它很慢,我也不知道每个上下文的名称意味着什么,也不知道它与帧和方法调用的关系 我(可能不正确)的理解是,由于可以在运行时添加或修改方法,R

我试图阅读有关Ruby性能的文章,其中一个答案提到“方法调用,Ruby中最常见的操作之一,速度特别慢。”

提到“它对方法进行“延迟查找”,以实现灵活性。这会使它的速度减慢很多。它还必须记住每个上下文的名称,以便进行求值,因此它的帧和方法调用速度较慢。”

有人能更详细地解释为什么Ruby方法调用特别慢,并详细说明第二个线程吗?我不完全确定什么是延迟查找或者为什么它很慢,我也不知道每个上下文的名称意味着什么,也不知道它与帧和方法调用的关系


我(可能不正确)的理解是,由于可以在运行时添加或修改方法,Ruby解释器永远不会“记住”如何运行特定的方法,因此它必须在程序每次运行时查找该方法,这就是所谓方法调用缓慢的意思。但是更正和更多的技术解释会很好。

编译语言通常有快速的方法分派,因为调用代码知道类的vtable的索引,vtable是一个方法指针数组。只需取消几次指针引用,调用代码就可以直接跳入方法。编译器创建vtable,并用vtable中方法的数字索引替换源代码中的每个方法名称

诸如Ruby之类的动态语言通常具有缓慢的方法调度,因为调用代码具有方法的名称,而不是指针(也不是包含指针的数组的索引)。调用代码必须向对象询问其类,然后询问该类是否有该名称的方法,如果没有,则向上询问每个祖先是否有该名称的方法(这是编译器在编译语言中所做的,这就是编译速度慢且方法分派速度快的原因)。动态语言必须执行几十到几百条机器指令来搜索对象的类和所有对象的祖先类以查找方法,而不是只需几条机器指令就可以调用一个方法。每个类都有一个名->方法的哈希表,但具有字符串键的哈希表比具有整数索引的数组慢一个数量级


当然,在动态语言中有优化方法调度的方法。在Ruby中,这就是JRuby、Rubinius和IronRuby正在研究的内容。但这是另一个问题的主题。

需要记住的一件重要事情是,慢是一个相对术语。与其他语言/环境相比,Ruby方法调用速度可能较慢,但对于您可能正在执行的任何特定任务来说都是完全可以接受的。您的理解是正确的。如果您将Apple与Apple进行比较,即Ruby与其他动态类型的解释语言(如Python、Perl、PHP等)的比较。。。它真的不慢。当然,我们谈论的是标准实现。事实上,CRuby 1.9.2的方法调用比CPython 2.7和3.1都要快得多。投票结束不是一个真正的问题。