Ruby 2.2.0中的Mashalling比2.1.5慢

dav*_*vej 6 ruby floating-point performance marshalling

我有一个复杂的对象my_object,我将其编组

Marshal.dump(my_object)

我已经在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)
Run Code Online (Sandbox Code Playgroud)

(我为每个版本运行了3次基准测试,要彻底.)

正如你所看到的,它在2.2.0和2.1.5之间的速度超过3倍.我把它归结为Marshal.dump因为,使用ruby-prof宝石,它向我展示了那条表现不佳的线条; 但我找不到一种方法来获取Marshal.dump本身在探查器中调用的方法.

编辑:经过大量实验后发现,用最小的复制品查看我的答案

saw*_*awa 3

源位置是nil.

Marshal.method(:dump).source_location
#=> nil
Run Code Online (Sandbox Code Playgroud)

这意味着它是一个 C 实现的方法,并且没有更多可以跟踪的 Ruby 代码。换句话说,它是一种原子/基本方法。

如果您相信您的结果是有效的,那么我建议您将其作为 bug 发布到Ruby trunk中。最新版本的 Ruby 确实发现了几个性能问题,因此您的情况似乎并不罕见。