【发布时间】:2016-06-23 10:44:12
【问题描述】:
当我将each_value 应用于哈希时,它所用的时间比我使用values 时要长得多,尽管each_value 表面上避免了分配和复制数组。
我写了一个简单的对比:
require 'benchmark/ips'
some_hash = File.open('with_an.dat') { |f| Marshal.load f }
Benchmark.ips do |x|
x.report "calling each_value" do
some_hash.each_value
end
x.report "calling values" do
some_hash.values
end
x.compare!
end
Benchmark.ips do |x|
x.report "summing each_value" do
some_hash.each_value.inject &:+
end
x.report "summing values" do
some_hash.values.inject &:+
end
x.compare!
end
结果如下:
Calculating -------------------------------------
calling each_value 58.166k i/100ms
calling values 2.000 i/100ms
-------------------------------------------------
calling each_value 1.312M (±40.7%) i/s - 5.468M
calling values 29.423 (±10.2%) i/s - 146.000
Comparison:
calling each_value: 1312156.6 i/s
calling values: 29.4 i/s - 44596.28x slower
Calculating -------------------------------------
summing each_value 1.000 i/100ms
summing values 1.000 i/100ms
-------------------------------------------------
summing each_value 2.107 (± 0.0%) i/s - 11.000
summing values 8.002 (±12.5%) i/s - 40.000
Comparison:
summing values: 8.0 i/s
summing each_value: 2.1 i/s - 3.80x slower
正如预期的那样,仅仅调用每个方法,each_value 的速度要快得多,因为它只需要创建一个Enumerator,并且实际上并不遍历哈希表。同时,values 必须复制整个数组。
然而,当我将这些值相加时,each_value 方法似乎比values 方法慢 3 倍。为什么会这样?
【问题讨论】:
-
产生每个单独值的开销?
-
inject(:+)可以,而且应该比inject(&:+)快。 -
@SergioTulentsev 你是什么意思?这两种方法都产生了单独的值。
-
@mudasobwa:啊,确实。
标签: ruby performance internals