【问题标题】:Why does Process.fork make stuff slower in Ruby on OS X?为什么 Process.fork 会使 OS X 上的 Ruby 中的东西变慢?
【发布时间】:2016-12-15 03:00:07
【问题描述】:

有人可以向我解释为什么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)上运行该代码不会对性能产生负面影响。

【问题讨论】:

    标签: ruby macos performance unix fork


    【解决方案1】:

    “为什么 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)
    

    没有明显的分叉进程变慢或变快的模式。我已经在 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)?

    【讨论】:

      猜你喜欢
      • 2012-06-15
      • 1970-01-01
      • 2021-03-26
      • 2017-05-12
      • 2016-01-29
      • 2011-05-06
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多