gpt4 book ai didi

ruby - 为什么在某些情况下 Ruby 的 Hash#values 比 Hash#each_value 更快?

转载 作者:数据小太阳 更新时间:2023-10-29 07:37:32 24 4
gpt4 key购买 nike

当我将 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 倍。为什么会这样?

最佳答案

迭代 Hash 比迭代 Array 慢:

 ▶ Benchmark.bm do |x|
▷ x.report do
▷ n.times do
▷ {a: 1, b: 2, c: 3, d: 4, e: 5}.inject(1) { |memo, (_, v)| memo * v }
▷ end
▷ end
▷ x.report do
▷ n.times do
▷ [1, 2, 3, 4, 5].inject(1) { |memo, v| memo * v }
▷ end
▷ end
▷ end

#⇒ user system total real
#⇒ 0.700000 0.010000 0.710000 ( 0.712821)
#⇒ 0.340000 0.000000 0.340000 ( 0.349040)

通过调用 each_value 实际上迭代了原始的 Hash 实例,而通过调用 values.each 迭代是在 Array 实例(。)

要回答“为什么会这样”这个问题,可能应该看看 rb_hash_foreachrb_array_foreach 不同 ruby​​ 版本的本地实现。

关于ruby - 为什么在某些情况下 Ruby 的 Hash#values 比 Hash#each_value 更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35885146/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com