Project

General

Profile

Feature #15435

Updated by shuujii (Shuji KOBAYASHI) almost 6 years 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