Issue #15435 has been updated by shuujii (Shuji KOBAYASHI).

File use-predefined-infinity.patch added
File benchmark.yml added
Tracker changed from Bug to Feature
Subject changed from Float の Infinity ... to Float の Infinity に生成済みの値を使用する
ruby -v deleted (ruby 2.6.0rc2 (2018-12-15 trunk 66408) [x86_64-linux])
Backport deleted (2.4: UNKNOWN, 2.5: UNKNOWN)

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
~~~


----------------------------------------
Feature #15435: Float の Infinity に生成済みの値を使用する
https://bugs.ruby-lang.org/issues/15435#change-75776

* Author: shuujii (Shuji KOBAYASHI)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
----------------------------------------


---Files--------------------------------
use-predefined-infinity.patch (8.97 KB)
benchmark.yml (192 Bytes)


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