Ruby 2.2.0中的Mashalling比2.1.5慢

Ruby 2.2.0中的Mashalling比2.1.5慢,ruby,performance,floating-point,marshalling,Ruby,Performance,Floating Point,Marshalling,我有一个复杂的对象,我的_对象,我用它进行封送 Marshal.dump(我的_对象) 我已经在2.1.5p273和2.2.0中对调用该线路100次的性能进行了基准测试,结果如下: 2.1.5 user system total real Marshal Dump 7.310000 0.120000 7.430000 ( 8.988470) Marshal Dump 7.520000 0.050000

我有一个复杂的对象,我的_对象,我用它进行封送

Marshal.dump(我的_对象)

我已经在2.1.5p273和2.2.0中对调用该线路100次的性能进行了基准测试,结果如下:

2.1.5  
                  user     system      total        real
Marshal Dump  7.310000   0.120000   7.430000 (  8.988470)
Marshal Dump  7.520000   0.050000   7.570000 (  8.210356)
Marshal Dump  7.610000   0.050000   7.660000 (  8.432685)

2.2.0
                  user     system      total        real
Marshal Dump 26.480000   0.150000  26.630000 ( 29.591742)
Marshal Dump 24.100000   0.300000  24.400000 ( 28.520397)
Marshal Dump 26.210000   0.210000  26.420000 ( 29.993412)
(为了彻底起见,我对每个版本运行了3次基准测试。)

正如您所看到的,在2.2.0和2.1.5版本中,它所花费的时间超过了3倍。我把重点放在Marshal.dump上,因为使用ruby prof gem,它向我表明这是性能不佳的一行;但是我找不到一种方法来获取Marshal.dump本身在分析器中调用的方法


编辑:在经过多次实验后发现,只需少量的复制即可查看我的答案。源位置为
nil

Marshal.method(:dump).source_location
#=> nil
这意味着它是一个C实现的方法,没有更多的Ruby代码可以跟踪。换句话说,它是一种原子/基本方法


如果您认为您的结果是有效的,那么我建议您将其作为bug发布在。对于最新版本的Ruby,确实发现了一些性能问题,因此您的情况似乎并不罕见。

是编组浮动导致了速度减慢

require 'benchmark'

class ToBeMarshaled

  def initialize n
    @a = []
    n.times do |i|
      @a << i.to_f
    end
  end

end

tbm = ToBeMarshaled.new(10000)

n = 100

Benchmark.bm do |x|
  x.report("Marshal Dump") {for i in 1..n; Marshal.dump(tbm); end}
end
大约慢35倍

如果从该代码中去掉“.to_f”,则会得到:

2.1.5
                  user     system      total        real
Marshal Dump  0.160000   0.000000   0.160000 (  0.180247)
Marshal Dump  0.180000   0.000000   0.180000 (  0.189485)
Marshal Dump  0.160000   0.010000   0.170000 (  0.191304)

2.2.0
                  user     system      total        real
Marshal Dump  0.120000   0.010000   0.130000 (  0.146710)
Marshal Dump  0.130000   0.010000   0.140000 (  0.159851)
Marshal Dump  0.130000   0.000000   0.130000 (  0.143917)

2.2.0略微超出了2.1.5。

感谢您的技术和建议。现在开始寻找问题的微小可复制版本!对于那些想了解这一点的人,我将其缩减为最小的复制,并将其记录在此处:。问题似乎不是大小,而是复杂程度,因为我必须创建一个包含许多嵌套对象的对象来重现问题。你编辑的方式使原始问题消失,而这个问题……好吧,这不是一个问题,基本上是一个答案。我认为整件事都很有趣,但就这么多标准而言,我认为它值得投反对票。@ian:真的吗?我的选择是留下一个对任何人都没有帮助的问题,或者发布一些我认为是非常重要的东西,或者删除整个问题。我做了我认为对社区最好的事。老实说,像你这样的小事让极客们名声扫地。是的,真的。这不是小事,而是网站的运作方式。我来到这个问题,原来的问题不见了,答案就在这里!如果您有答案,请使用答案表。如果要对问题进行编辑,请以清晰的方式进行编辑。通常只需要一行字和“编辑:进一步的信息”。我把它放回原样,现在大部分是浪费时间和空间,因为现在已知的根本原因是非常具体的,而原始帖子现在大部分是无关的。但规则就是规则。。。。
2.1.5
                  user     system      total        real
Marshal Dump  0.160000   0.000000   0.160000 (  0.180247)
Marshal Dump  0.180000   0.000000   0.180000 (  0.189485)
Marshal Dump  0.160000   0.010000   0.170000 (  0.191304)

2.2.0
                  user     system      total        real
Marshal Dump  0.120000   0.010000   0.130000 (  0.146710)
Marshal Dump  0.130000   0.010000   0.140000 (  0.159851)
Marshal Dump  0.130000   0.000000   0.130000 (  0.143917)