虽然速度快了那么一点点,但却让我们陷入选择字符串还是 symbol 的蛋疼事中,更是出现像
Hash#stringify_keys
和Hash#symbolize_keys
这种方法,被调用者得到一个 hash 不得不去想一下传入的是 symbol 还是 string。
而 hash 的写法也出现了{:xx => 1}
与 {xx: 1}
, 前者可以是任何对象,而后者的 key 就是一个 symbol。。
今天闲的无聊测试了一下性能
sym_keys = []
str_keys = []
1000000.times {|i| str_keys << "number_#{i}_asdf"; sym_keys << "number_#{i}_asdf".to_sym }
require 'benchmark'
[100000, 1000000].each do |length|
str_hash = {}; sym_hash = {}
Benchmark.bm do |x|
x.report("#{length} string write") { length.times {|i| str_hash[str_keys[i]] = i } }
x.report("#{length} symbol write") { length.times {|i| sym_hash[sym_keys[i]] = i } }
x.report("#{length} string read") { length.times {|i| str_hash[str_keys[rand(length)]] } }
x.report("#{length} symbol read") { length.times {|i| sym_hash[sym_keys[rand(length)]] } }
end
end
Ruby 2.1.3 结果如下
user system total real
100000 string write 0.060000 0.000000 0.060000 ( 0.064129)
100000 symbol write 0.040000 0.000000 0.040000 ( 0.044240)
100000 string read 0.090000 0.000000 0.090000 ( 0.098106)
100000 symbol read 0.050000 0.000000 0.050000 ( 0.052136)
user system total real
1000000 string write 1.030000 0.040000 1.070000 ( 1.066663)
1000000 symbol write 0.810000 0.020000 0.830000 ( 0.833698)
1000000 string read 1.010000 0.010000 1.020000 ( 1.021844)
1000000 symbol read 0.710000 0.000000 0.710000 ( 0.713959)
从数据上看,symbol 相对于 string 的性能提升并没有多大,而我在 2.1.2 下测试得到的是,在 100W 数据下,symbol 反而变慢了,可能是 symbol 表太大了,查询也变慢了?这就不清楚了
抛砖引玉,大家发表下看法?我测试的只是 hash, 在其它情况下是否会有更优异的表现?
写着有点离题了,我疑惑的是 symbol 存在的意义,现在感觉他的出现,带来的麻烦比带来的好处更多。。