为什么Process.fork在OS X上的Ruby中变慢?

时间:2016-08-09 07:15:59

标签: ruby macos performance unix fork

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

1 个答案:

答案 0 :(得分: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)?