float と big decimalをなんとなくベンチした

rubyで
3.14 * 10
=> 31.400000000000002
ってなるよなーって思ってbig decimalベンチしてみた。

手元のthinkpad x1 carbon 2016 にubuntu 16.04

$ ruby -v
ruby 2.4.0p0 (2016-12-24 revision 57164) [x86_64-linux]

$ cat float-vs-big-decimal.rb
require 'bigdecimal'
require 'benchmark'

n = 1000000
Benchmark.bm do |r|
  r.report "float" do
    n.times do
      3.14 * 10
    end
  end
  r.report "big decimal" do
    n.times do
      BigDecimal("3.14") * BigDecimal("10")
    end
  end
end
(rc->0)
$ ruby float-vs-big-decimal.rb 
       user     system      total        real
float  0.060000   0.000000   0.060000 (  0.052816)
big decimal  0.960000   0.000000   0.960000 (  0.967326)

生成コストでフェアじゃない?気もするけど 最後人間に読めるようにto_f するとか細かいこと気にするなってことで。16倍、思ったほどではなかった もうbigdecimal常用でいいのかな。もちろん用途によるんだけど。
キャッシュするとかベンチになってないとかあるかも。あんまりわかってないから。

$ ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
$ ruby float-vs-big-decimal.rb                                                  
       user     system      total        real
float  0.060000   0.000000   0.060000 (  0.055150)
big decimal  1.020000   0.000000   1.020000 (  1.020329)

手元のrubyははじめ謎のバージョンで止まってたままだった。けど2.4にあげたら20倍が16倍になってなるほどはやくなってるんだ。

あとBenchmark.bm の後ろの数字繰り返し回数かと思って Benchmark.bm 1000000 do |r| ってやってすごい文字数空白出てきた。はてなマーク出しながら10回ぐらいやっておかしくねって気づいた。ラベルの幅て。

広告

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中