2011/6/21 Iñaki Baz C. [email protected]:
2011/6/21 Robert K. [email protected]:
See Adam’s and Josh’s replies: a Hash is generally unordered.
However, what do you need this for? If it is for debugging purposes
then you might as well override #inspect on a per instance basis or
change it in Hash (not recommended).
Hi, I don’t understand your comment.
Sorry, my dog pressed “sent mail”.
I meant that I don’t understand the point of your comments. In Ruby
1.9 Hashes are ordered. I cannot change the order after creating them,
but if you inspect elements of a Hash you get them in the order in
which they were inserted. This is valid and useful for me (in my
case).
If you need that for other
reasons then maybe a tree might be a better choice. There is for
example
http://raa.ruby-lang.org/project/ruby-rbtree/
I already worker with rbtree. The only difference (or one of them) is
the way in which keys are inserted. rbtree requires all the keys being
the same class. In my tests rbtree is better for deleting elements but
worse than a Hash for inserting them.
You can check it:
require “benchmark”
@hash = {}
@rbtree = RBTree.new
TIMES = ARGV[0] ? ARGV[0].to_i : 10000
WORD = “z9hG4bK”.freeze
def gen_word(word, n)
case word
when :fixed_begin
WORD + n.to_s
when :dynamic_begin
n.to_s + WORD
end
end
def test(word)
puts
case word
when :fixed_begin
puts “Using word: "z9hG4bK" + n.to_s”
when :dynamic_begin
puts “Using word: n.to_s + "z9hG4bK"”
end
puts
printf "- Hash insertion: "
puts time_hash_insertion = Benchmark.realtime {
TIMES.times do |n|
@hash[gen_word(word, n)] = 12345
end
}
printf "- RBTree insertion: "
puts time_rbtree_insertion = Benchmark.realtime {
TIMES.times do |n|
@rbtree[gen_word(word, n)] = 12345
end
}
puts
printf "- Hash deletion: "
puts time_hash_deletion = Benchmark.realtime {
TIMES.times do |n|
@hash.delete(gen_word(word, n))
end
}
printf "- RBTree deletion: "
puts time_rbtree_deletion = Benchmark.realtime {
TIMES.times do |n|
@rbtree.delete(gen_word(word, n))
end
}
puts
puts “TOTAL:”
puts “- Hash insertion + deletion: #{time_hash_insertion +
time_hash_deletion}”
puts “- RBTree insertion + deletion: #{time_rbtree_insertion +
time_rbtree_deletion}”
end
puts “Entries: #{TIMES}”
puts
test(:fixed_begin)
puts
test(:dynamic_begin)
Results:
Entries: 10000
Using word: “z9hG4bK” + n.to_s
-
Hash insertion (seconds): 0.020041227340698242
-
RBTree insertion (seconds): 0.041683197021484375
-
Hash deletion (seconds): 0.035521745681762695
-
RBTree deletion (seconds): 0.023290157318115234
TOTAL:
- Hash insertion + deletion (seconds): 0.05556297302246094
- RBTree insertion + deletion (seconds): 0.06497335433959961
Using word: n.to_s + “z9hG4bK”
-
Hash insertion (seconds): 0.019947528839111328
-
RBTree insertion (seconds): 0.0295107364654541
-
Hash deletion (seconds): 0.029720067977905273
-
RBTree deletion (seconds): 0.01738262176513672
TOTAL:
- Hash insertion + deletion (seconds): 0.0496675968170166
- RBTree insertion + deletion (seconds): 0.04689335823059082