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

标签 ruby performance interpreter interpreted-language

我正在尝试阅读有关 Ruby 性能的信息,并遇到了 this SO thread ,其中一个答案提到“方法调用,Ruby 中最常见的操作之一,特别慢。”

Another thread提到“它对方法进行“后期查找”,以提供灵 active 。这会减慢它的速度。它还必须记住每个上下文的名称以允许 eval,因此它的框架和方法调用速度较慢。”

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

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

最佳答案

编译型语言通常具有快速的方法分配,因为调用代码知道类的 vtable 的索引,它是一个方法指针数组。在几个指针取消引用之后,调用代码可以直接跳转到方法中。编译器创建虚表,并将源代码中的每个方法名替换为虚表中方法的数字索​​引。

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

当然,有一些方法可以优化动态语言中的方法调度。在 Ruby 中,这就是 JRuby、Rubinius 和 IronRuby 正在努力的方向。但这是另一个问题的主题。

关于ruby - 为什么 Ruby 方法调用特别慢(与其他语言相比)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6406112/

相关文章:

assembly - TI DSP 编程 - C 足够快还是我需要汇编程序?

python线程和性能?

python - 在 numba nopython 函数中计算阶乘的最快方法

hive - zeppelin hive 解释器抛出 ClassNotFoundException

interpreter - 需要帮助设计解释器

ruby - 为什么一个 Ruby 程序/进程会产生多个线程?

ruby-on-rails - 时间不在 heroku 中更新

ruby-on-rails - Ruby:将一组 ActiveRecord 对象分组到散列中

ruby - gem 二进制文件可以自带制表符补全吗?

ruby-on-rails - 通过 JSON 调用创建 Devise 用户