gpt4 book ai didi

ruby - 如何测量 eval "def ..."和 define_method 的性能

转载 作者:数据小太阳 更新时间:2023-10-29 07:50:24 26 4
gpt4 key购买 nike

在进行 RubyMonk 中的练习时(付费专区后面的链接,因此未提供),为了衡量使用 eval 定义方法的性能与 define_method 相比,以下内容提供代码:

require 'benchmark'

class Monk
eval "def zen; end"

define_method(:zen_block) {}
end

monk = Monk.new

Benchmark.bmbm do |x|
x.report("eval zen: ") { 1_000_000.times { monk.zen } }
x.report("define_method zen: ") { 1_000_000.times { monk.zen_block } }
end

作为 Ruby 的新手,我的问题是:方法 zenzen_block 什么时候真正被解释器“编译”(不确定这个词是否正确) ? zenzen_block 似乎不太可能在每次调用时都被重新定义。据我目前的了解,在我看来,衡量性能的正确方法是:

require 'benchmark'

class Monk
def with_eval
eval "def zen; end"
end

def with_define_method
self.class.send(:define_method,:zen_block) {}
end
end

Benchmark.bmbm do |x|
x.report("eval zen: ") { 1_000_000.times { monk.with_eval } }
x.report("define_method zen: ") { 1_000_000.times { monk.with_define_method } }
end

第一个 block 在我的机器中产生这些结果(我将迭代次数提高到 100 万以使时间更稳健):

Rehearsal -------------------------------------------------------
eval zen: 0.070000 0.000000 0.070000 ( 0.074196)
define_method zen: 0.120000 0.000000 0.120000 ( 0.118621)
---------------------------------------------- total: 0.190000sec

第二 block 的结果(我的建议):

Rehearsal -------------------------------------------------------
eval zen: 7.740000 0.000000 7.740000 ( 7.743741)
define_method zen: 1.620000 0.000000 1.620000 ( 1.617666)
---------------------------------------------- total: 9.360000sec

最佳答案

您从 RubyMonk 显示的基准测试并未测量使用 evaldefine_method定义方法的速度。它衡量调用结果方法的速度。这就是它以这种方式读取的原因。

在您深入了解 Ruby 解释器的实现之前,您可能不太清楚,通过 evaldefine_method 定义的方法的速度是一般不一样。

关于ruby - 如何测量 eval "def ..."和 define_method 的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15071599/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com