Issue #10999 has been updated by Nobuyoshi Nakada.


It is not a realistic benchmark, that integer parts are all different.

Adding floats with same integer parts shows very bad result in the older version, whereas the latest version does not.

~~~ruby
h = {}
strs = [*1..10000].map! {|i| i.fdiv(100)}
strs.each { |s| h[s] = s }
50.times { strs.each { |s| h[s] } }
~~~

-----------------------------------------------------------
benchmark results:
Execution time (sec)

name         |old    |new
-------------|------:|------:
hash_aref_flo|  0.942|  0.084

Speedup ratio: compare with the result of `old' (greater is better)

name         |new
-------------|------:
hash_aref_flo| 11.175

This is because the older code ignored fraction parts, and it became neary linear search.


----------------------------------------
Bug #10999: [PERF] bm_hash_aref_flo.rb
https://bugs.ruby-lang.org/issues/10999#change-51930

* Author: Guo Xiang Tan
* Status: Open
* Priority: Normal
* Assignee: Nobuyoshi Nakada
* ruby -v: 2.3.0dev (2015-03-18 trunk 49999) [x86_64-linux]
* Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN
----------------------------------------
Before: 0.066s
After [3bcf9fb53e4b9efabb15a3091fddfb68e5b6fbbe](https://github.com/ruby/ruby/commit/3bcf9fb): 0.094

To view the full graph, please visit http://rubybench.org/ruby/ruby/commits?result_type=hash_aref_flo&display_count=200.

To issue is meant to highlight what we're seeing at RubyBench.org, feel free to close this issue if the trade offs were intended. 



-- 
https://bugs.ruby-lang.org/