2016-08-09 37 views
4

有人可以向我解釋爲什麼Process.fork使Ruby在Ruby中變得如此之慢?我在OS X El Capitan上使用Ruby 2.3.1。爲什麼Process.fork在Ruby on OS X上讓東西變慢?

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

「爲什麼Process.fork在Ruby on OS X上讓東西變慢?」

第一步到底是爲了減少變量的數量。

你運行Time.parse(Time.utc(2016).iso8601)五萬次的例子看起來很奇怪。我使用不同的「慢」紅寶石任務重新基準測試:

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不,在一般情況下,做出的東西較慢的Ruby on OS X.

然而,有一個不同的有趣的問題,在這裏,這是Why is `Time.utc` slower in a forked process in Ruby on OS X (and not in Python)?