哪种方式对哈希存储有效?

时间:2015-04-10 07:28:36

标签: ruby hash

假设my_hash = {:name => "bob", :age => 21}。我可以通过三种方式为哈希值分配值:

方式1

my_hash[:name] = "bob"
my_hash[:age]  =  21 

方式2

my_hash.store(:name,"bob")
my_hash.store(:age,21)

方式3

my_hash = {:name => "bob", :age => 21}

请帮助我理解操作系统内存方面的值分配。为什么有三种方法可以为键指定值,哪种方式有效?

2 个答案:

答案 0 :(得分:2)

内存记忆我认为所有内存都相同。我对每个步骤进行了基准测试,这些都是结果。正如你所看到的,每种情况的速度只是略有不同,没有足够的差异来选择其中一种。

因此,您只需使用编写代码时感觉自然的代码。

       user     system      total        real
   0.760000   0.030000   0.790000 (  0.808573) my_hash[:t] = 1
   0.810000   0.030000   0.840000 (  0.842075) my_hash.store(:t, 1)
   0.750000   0.020000   0.770000 (  0.789766) my_hash = {:t => 1}

基准测试脚本。

require 'benchmark'

Benchmark.bm do |x|
  x.report do
    1000000.times do
      my_hash = {}
      my_hash[:t] = 1
      my_hash[:b] = 2
    end
  end
  x.report do
    1000000.times do
      my_hash = {}
      my_hash.store(:t, 1)
      my_hash.store(:b, 2)
    end
  end
  x.report do
    1000000.times do
      my_hash = {:t => 1, :t => 2}
    end
  end
end

答案 1 :(得分:1)

我更倾向于使用基准测试ips这样的事情,因为它可以计算出应该执行多少次测试,并且它还会给你一些误差。对于这个

Benchmark.ips do |x|
  x.report('[]') do |n|
    n.times do
      t  = {}
      t[:x] = 1
    end
  end

  x.report('store') do |n|
    n.times do
      t  = {}
      t.store(:x, 1)
    end
  end
end

产生

[]         2.082M (±14.6%) i/s -     10.276M
store      1.978M (±13.9%) i/s -      9.790M

即。差异在误差范围内,这并不令人惊讶,因为如果您查看source,那么您可以看到[]=store实际上是完全相同的方法