Project

General

Profile

Feature #15435

Updated by shuujii (Shuji KOBAYASHI) 11 months ago

Float の Infinity はしばしば使われると思うのですが、Flonum が有効でも即値に
ならないので、演算の結果や C から DBL2NUM で返却される場合などに毎回オブ
ジェクトが生成されます。

Ruby リポジトリーで、Infinity オブジェクトが生成されると明確に分かる場所を簡
単に調べた限りでは20数箇所ありました。

~~~
$ grep 'DBL2NUM.*HUGE_VAL' $(git ls-files | awk '/\.c$/ && !/^(spec|ext\/-test-)\//') | wc -l
21
$ egrep -- '-Float::INFINITY' $(git ls-files | egrep '^(lib|ext)/.*\.rb$') | wc -l
2
~~~

それで、Infinity の場合は生成済みのオブジェクトを返すようにしてはどうでしょ
うか。

パッチを添付します。添付のベンチマークを benchmark-driver で実行した限りでは、
演算結果が Infinity になる場合は性能が向上し、そうでない場合は有意な差はない
(計測の度にかなりばらつきがあるが概ね10%以内の差におさまる) ようでした。

~~~
Calculating -------------------------------------
compare-ruby built-ruby
positive_infinity 34.531M 62.540M i/s - 3.000M times in 0.195822s 0.107997s
negative_infinity 42.581M 94.234M i/s - 3.000M times in 0.159061s 0.071766s
flonum 142.010M 150.967M i/s - 3.000M times in 0.047544s 0.045120s
heap 33.952M 34.629M i/s - 3.000M times in 0.199321s 0.195063s

Comparison:
positive_infinity
built-ruby: 62540441.7 i/s
compare-ruby: 34530877.6 i/s - 1.81x slower

negative_infinity
built-ruby: 94234135.1 i/s
compare-ruby: 42580998.6 i/s - 2.21x slower

flonum
built-ruby: 150967185.7 i/s
compare-ruby: 142010146.8 i/s - 1.06x slower

heap
built-ruby: 34629459.1 i/s
compare-ruby: 33952081.8 i/s - 1.02x slower
~~~

Back