假设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}
请帮助我理解操作系统内存方面的值分配。为什么有三种方法可以为键指定值,哪种方式有效?
答案 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
实际上是完全相同的方法