gpt4 book ai didi

ruby - 为什么 ruby​​ 中的 'eval' 这么慢?

转载 作者:数据小太阳 更新时间:2023-10-29 08:22:59 25 4
gpt4 key购买 nike

在下面的 ruby​​ 代码中,'eval' 比 'def' 慢 10 多倍。

我知道“eval”需要解析字符串,但我想在这个例子中只需要解析一次。

require "benchmark"
GC.disable

eval "def run1; 10_000.times { #{"$a[5]\n" * 10_000} } end"
def run2
10_000.times { "#{"$a[5]\n" * 10_000}" }
end

$a = [1,2,3,4,5,6,7,8,9,10]

puts "run1:"
puts Benchmark.measure { run1 }

puts "run2:"
puts Benchmark.measure { run2 }

最佳答案

您不是在比较等效函数。 run1 最终成为在单个字符串中包含 $a[5]\n 10,000 次的函数,因为字符串插值发生在构建字符串时,在 之前eval 被调用。 run2 按预期运行。

要查看差异,请将 ruby-prof 加入其中:

require "benchmark"
require 'ruby-prof'

GC.disable

eval "def run1; 10_000.times { #{"$a[5]\n" * 10_000} } end"
def run2
10_000.times { "#{"$a[5]\n" * 10_000}" }
end

$a = [1,2,3,4,5,6,7,8,9,10]

puts "run1:"
RubyProf.start
puts Benchmark.measure { run1 }
result = RubyProf.stop
printer = RubyProf::FlatPrinter.new(result)
printer.print(STDOUT)

puts "run2:"
RubyProf.start
puts Benchmark.measure { run2 }
result = RubyProf.stop
printer = RubyProf::FlatPrinter.new(result)
printer.print(STDOUT)

编辑:这里是结果(我删除了 Benchmark 调用以将其精简到最基本)

(nick@monster)-(~/Desktop)
(523)⚡️ ruby derp.rb
run1:
Thread ID: 2156059640
Fiber ID: 2163430960
Total: 484.962207
Sort by: self_time

%self total self wait child calls name
100.00 484.962 484.962 0.000 0.000 1 Integer#times
0.00 484.962 0.000 0.000 484.962 1 Global#[No method]
0.00 484.962 0.000 0.000 484.962 1 Object#run1

* indicates recursively called methods
run2:
Thread ID: 2156059640
Fiber ID: 2163430960
Total: 0.265188
Sort by: self_time

%self total self wait child calls name
94.02 0.249 0.249 0.000 0.000 10000 String#*
5.98 0.265 0.016 0.000 0.249 1 Integer#times
0.01 0.265 0.000 0.000 0.265 1 Global#[No method]
0.00 0.265 0.000 0.000 0.265 1 Object#run2

* indicates recursively called methods

关于ruby - 为什么 ruby​​ 中的 'eval' 这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23002685/

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