gpt4 book ai didi

ruby - 为什么 Process.fork 会使 OS X 上的 Ruby 变慢?

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

有人可以向我解释为什么 Process.fork 会使 Ruby 中的东西变慢吗?我在 OS X El Capitan 上使用 Ruby 2.3.1。

require 'time'
require 'benchmark'

def do_stuff
50000.times { Time.parse(Time.utc(2016).iso8601) }
end

puts Benchmark.measure { do_stuff } # => 1.660000 0.010000 1.670000 ( 1.675466)

Process.fork do
puts Benchmark.measure { do_stuff } # => 3.170000 6.250000 9.420000 ( 9.508235)
end

编辑:刚注意到在 Linux(经过测试的 Debian 或 Ubuntu)上运行该代码不会对性能产生负面影响。

最佳答案

“为什么 Process.fork 会使 OS X 上的 Ruby 变慢?”

深入了解的第一步是减少变量的数量。

您运行 Time.parse(Time.utc(2016).iso8601) 五万次的示例似乎非常具体。我使用不同的“慢速”Ruby 任务重新制定了基准测试:

require 'benchmark'

def do_stuff
a = [nil] * 200

10.times do
a.each {|x| a.each {|y| a.each {|z| ; }}}; ()
end
end

puts "main: #{Benchmark.measure { do_stuff }}"

Process.fork do
puts "fork: #{Benchmark.measure { do_stuff }}"
end

在这里,我已将您的 Time 命令替换为大型数组上的无操作嵌套循环。

结果:

main:   4.020000   0.010000   4.030000 (  4.050664)
fork: 3.940000 0.000000 3.940000 ( 3.962207)

main: 3.840000 0.010000 3.850000 ( 3.856188)
fork: 3.850000 0.000000 3.850000 ( 3.865250)

main: 3.930000 0.000000 3.930000 ( 3.937741)
fork: 3.970000 0.000000 3.970000 ( 3.986397)

main: 4.340000 0.010000 4.350000 ( 4.370009)
fork: 4.300000 0.000000 4.300000 ( 4.308156)

没有明显的 fork 进程变慢或变快的模式。我已经在 OS X 和 Ubuntu 上的 Ruby 1.9、2.0 和 2.3 中进行了测试,结果保持不变。

你的问题的答案是:

Process.fork 通常不会使 OS X 上的 Ruby 变慢。

然而,这里有一个不同的有趣问题,即Why is `Time.utc` slower in a forked process in Ruby on OS X (and not in Python)?

关于ruby - 为什么 Process.fork 会使 OS X 上的 Ruby 变慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38844392/

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