From: WATANABE Hirofumi Date: 2002-03-11T20:02:03+09:00 Subject: [ruby-dev:16326] Re: ライブラリ拡大計画 わたなべです。 Yukihiro Matsumoto writes: :|古い(rubyでは恐らく使っていない)dbmやndbmにはキーとデータの合計が1024 :|バイトを越えられないという制約があったと思います。sdbmは、このあたりは :|どうなっていますか? :| :|また、性能面ではどうでしょう。 : :sdbmは制限ありまくりです。性能もあんまりよくないみたい。 :public domainでそこそこポータブルであること以外にメリットは :ないですね。 1024は定数なので増やせばいいとも言えますが、増やしたとしても たしかにそれはそれで制約にはなります。 性能はgdbmのほうが悪いくらい。 % ruby dbtest.rb user system total real gdbm write: 7.770000 9.220000 16.990000 ( 21.630699) sdbm write: 7.130000 4.250000 11.380000 ( 11.584454) gdbm read: 5.330000 2.590000 7.920000 ( 7.930583) sdbm read: 4.140000 1.210000 5.350000 ( 5.371838) ひょっとしたらもっと数を増やせば逆転するのかもしれないけど、 dbmとしての使いかたはそんなに大きなものじゃなくて手軽に使え る規模というターゲットにしぼれば、そんなに悪くないと思います。 include Benchmarkしないとエラーになったので、benchmark.rbへ のパッチもつけときます >ごとけんさん。 -- わたなべひろふみ require 'sdbm' require 'gdbm' require 'benchmark' n = 100000 Benchmark.bm(12) do |b| b.report("gdbm write:") do GDBM.open("gdbm") do |x| for i in 0..n x[i.to_s] = i.to_s end end end b.report("sdbm write:") do SDBM.open("sdbm") do |x| for i in 0..n x[i.to_s] = i.to_s end end end b.report("gdbm read:") do GDBM.open("gdbm") do |x| for i in 0..n dummy = x[i.to_s] end end end b.report("sdbm read:") do SDBM.open("sdbm") do |x| for i in 0..n dummy = x[i.to_s] end end end end --- benchmark.rb.bak Mon Nov 26 03:30:47 2001 +++ benchmark.rb Mon Mar 11 19:51:55 2002 @@ -18,3 +18,3 @@ if Process.respond_to? :times - def times() + def Benchmark::times() Process::times() @@ -22,3 +22,3 @@ else # for Ruby 1.6.x or earlier - def times() + def Benchmark::times() Time::times()