[#44925] [Backport93 - Backport #5702][Open] backport r33935 — Yusuke Endoh <mame@...>
19 messages
2011/12/03
[#44929] [Backport93 - Backport #5702] backport r33935
— Tomoyuki Chikanaga <nagachika00@...>
2011/12/05
[#44931] Re: [Backport93 - Backport #5702] backport r33935
— Yusuke Endoh <mame@...>
2011/12/05
GyRCMXNGIyRHJDkhIxsoQgoKGyRCJWwlUyVlITwkIiRqJCwkSCQmJDQkNiQkJF4kOSEjGyhCCgoK
[#44934] Re: [Backport93 - Backport #5702] backport r33935
— "NARUSE, Yui" <naruse@...>
2011/12/05
2011年12月5日12:39 Yusuke Endoh <mame@tsg.ne.jp>:
[#44940] Re: [ruby-cvs:41134] naruse:r33956 (trunk): Comment out tests which fails with GDBM-DBM compat mode. — Tanaka Akira <akr@...>
2011/12/6 <naruse@ruby-lang.org>:
9 messages
2011/12/05
[#44941] Re: [ruby-cvs:41134] naruse:r33956 (trunk): Comment out tests which fails with GDBM-DBM compat mode.
— KOSAKI Motohiro <kosaki.motohiro@...>
2011/12/05
2011年12月5日16:56 Tanaka Akira <akr@fsij.org>:
[#44942] Re: [ruby-cvs:41134] naruse:r33956 (trunk): Comment out tests which fails with GDBM-DBM compat mode.
— KOSAKI Motohiro <kosaki.motohiro@...>
2011/12/05
> おかしいな。gdbmは勝手にcreateフラグを立ててしまうので当該2つの
[#44943] Re: [ruby-cvs:41134] naruse:r33956 (trunk): Comment out tests which fails with GDBM-DBM compat mode.
— KOSAKI Motohiro <kosaki.motohiro@...>
2011/12/05
> def test_s_open_no_create
[#44944] Re: [ruby-cvs:41134] naruse:r33956 (trunk): Comment out tests which fails with GDBM-DBM compat mode.
— Tanaka Akira <akr@...>
2011/12/05
2011年12月6日7:19 KOSAKI Motohiro <kosaki.motohiro@gmail.com>:
[#44946] Re: [ruby-cvs:41134] naruse:r33956 (trunk): Comment out tests which fails with GDBM-DBM compat mode.
— KOSAKI Motohiro <kosaki.motohiro@...>
2011/12/06
>> DBM::VERSIONは仕様が腐っていて 1)本物のdbmとリンクした場合は
[#44947] Re: [ruby-cvs:41134] naruse:r33956 (trunk): Comment out tests which fails with GDBM-DBM compat mode.
— Tanaka Akira <akr@...>
2011/12/06
2011年12月6日12:51 KOSAKI Motohiro <kosaki.motohiro@gmail.com>:
[#44950] [ruby-trunk - Bug #5725][Assigned] Coverage doesn't honor file path encodings — Shyouhei Urabe <shyouhei@...>
6 messages
2011/12/08
[#44951] [ruby-trunk - Bug #5728][Open] SystemExit.new(bool, message) — Akira Tanaka <akr@...>
6 messages
2011/12/08
[#44961] [ruby-trunk - Bug #5731][Open] enum_for を使うと method_missing にブロックが渡されない — Masahiro Tomita <tommy@...>
4 messages
2011/12/09
[#44963] [ruby-trunk - Bug #5738][Open] if false; BEGIN {}; end が syntax error になる — Sho Hashimoto <sho-h@...>
5 messages
2011/12/10
[#44974] githubへの移行 — Shugo Maeda <shugo@...>
前田です。
10 messages
2011/12/12
[#44985] [ruby-trunk - Bug #5757][Open] main threadがreadやselectで待っていると、^C でなかなか死なない — Yui NARUSE <naruse@...>
12 messages
2011/12/13
[#45002] [ruby-trunk - Bug #5768][Assigned] TestRequire#test_race_exceptionで競合するケースがまだある — Yui NARUSE <naruse@...>
8 messages
2011/12/17
[#45021] [ruby-trunk - Bug #5786][Open] LoadError: cannot load such file -- openssl — Kazuhiro NISHIYAMA <redmine@...>
11 messages
2011/12/21
[#45022] [ruby-trunk - Bug #5786] LoadError: cannot load such file -- openssl
— Kazuhiro NISHIYAMA <redmine@...>
2011/12/21
[#45030] [ruby-trunk - Bug #5790][Open] net/http の EOFError と Keep-Alive — Yui NARUSE <naruse@...>
3 messages
2011/12/22
[#45034] Re: [ruby-dev:44974] githubへの移行 — Daehyub Kim <lateau@...>
44Oi44Or44Gn44GZ44CCCuOCiOOBneOCguOBruOBp+OBmeOBjOOAgeWwkeOBl+awl+OBq+OBquOC
9 messages
2011/12/22
[#45035] Re: githubへの移行
— "NARUSE, Yui" <naruse@...>
2011/12/22
2011年12月22日23:55 Daehyub Kim <lateau@gmail.com>:
[#45036] Re: githubへの移行
— Narihiro Nakamura <authornari@...>
2011/12/22
nariです。
[#45038] Re: githubへの移行
— KOSAKI Motohiro <kosaki.motohiro@...>
2011/12/22
> 成瀬さんがおっしゃってるログですが、以下にわりと古めのWikiページがある
[#45039] Re: githubへの移行
— Urabe Shyouhei <shyouhei@...>
2011/12/23
On 2011年12月23日 02:20, KOSAKI Motohiro wrote:
[ruby-dev:45028] [ruby-trunk - Feature #4495][Closed] PStoreの高速化
From:
Shota Fukumori <sorah@...>
Date:
2011-12-22 03:50:42 UTC
List:
ruby-dev #45028
Issue #4495 has been updated by Shota Fukumori.
Status changed from Open to Closed
closing. thank you for your contribution.
----------------------------------------
Feature #4495: PStoreの高速化
https://bugs.ruby-lang.org/issues/4495
Author: Masaki Matsushita
Status: Closed
Priority: Normal
Assignee:
Category: lib
Target version:
=begin
PStoreを少し速くしてみました。
加えた変更は以下の通りです。
* チェックサムをDigest::MD5.digestではなくZlib.crc32で求めるようにした
PStoreは無駄なファイルアクセスを減らす為、外部ファイルのチェックサムと内部のHashをMarshal.dumpしたもののチェックサムを比較して
両者が異なる場合のみ書き込みを行うようになっているのですが、そのチェックサムをDigest::MD5.digestではなくZlib.crc32で求めるように変更しました。
PStoreにおける用途では、暗号学的ハッシュ関数を使う必要はないはずなので、Zlib.crc32で十分ではないでしょうか。
Digest::MD5.digestと比較すると、Zlib.crc32の方が1.3~1.5倍ほど速いようです。
* 書き込みの際のチェックサム生成の後回し
上に書いたようにPStoreは書き込みの際にチェックサムを比較するのですが、その前にデータサイズの比較も行っていて、書き込み先のファイルのサイズと書き込もうとしているマーシャルデータのサイズが異なっていればその時点で書き込みが必要だと判断します。
しかし、データサイズの比較を行う前にチェックサムの生成を行っていたので、データサイズが同じである場合のみチェックサムを生成し比較するようにしました。
データサイズが異なっている場合にはチェックサムの生成と比較を行わずに済むので、若干の高速化が期待できます。
* メソッドmarshal_dump_supports_canonical_option?の削除
Ruby1.8ではHashの順序が保証されていなかったので、あるHashをMarshal.dumpしてできたStringと、そのStringをMarshal.loadしてできたHashを再度Marshal.dumpしてできたStringをString#==で比較するとfalseになる場合がありました。
Hongli Lai氏はこれを嫌ったようで、同じHashなら同じStringにdumpされるようなオプションを追加したMarshal.dumpのパッチを書いて、
さらにPStoreにもそのオプションがサポートされているかどうか調べるmarshal_dump_supports_canonical_option?というメソッドを追加したものと思われます。
(参考: http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/17243 )
このメソッドの中では
435 begin
436 Marshal.dump(nil, -1, true)
437 result = true
438 rescue
439 result = false
440 end
という事をして、このメソッドはresultを返すのですが、少なくともRuby1.9ではMarshal.dumpの引数が正しくないので必ずfalseが返ります。
よって調べても無駄なのでメソッドごと削除しました。
* File#truncateの後回し
PStoreは実際にマーシャルデータをファイルに書き込む際に
486 file.rewind
487 file.truncate(0)
488 file.write(data)
ファイルポインタを先頭に戻し、ファイルのサイズを0にしてから書き込みを始めていました。
しかし、File#truncateによるファイルサイズの変更は時間のかかる処理で、PStoreではこれがボトルネックとなっていました。
そこで、
file.rewind
file.write(data)
file.truncate(data.size)
ファイルポインタを先頭に戻したら、書き込みを始め、書き込みが終わった後に帳尻を合わせるようにしました。
File#truncateによって変更しなければならないサイズが抑えられ、高速化が期待できます。
全体でのパフォーマンスについてですが、次のようなベンチマークを行ったところ
require 'pstore'
p = PStore.new("foo")
p.transaction { p["hoge"] = "hoge" * ARGV.first.to_i }
10000.times do
p.transaction { p["hoge"] += "hoge" }
end
現在のPStoreでは
% time ruby pstore_bench.rb 1000
ruby pstore_bench.rb 1000 2.94s user 2.43s system 69% cpu 7.723 total
% time ruby pstore_bench.rb 10000
ruby pstore_bench.rb 10000 5.37s user 2.99s system 70% cpu 11.810 total
% time ruby pstore_bench.rb 100000
ruby pstore_bench.rb 100000 31.98s user 11.09s system 69% cpu 1:02.15 total
となったのに対して上記の変更を加えたPStoreでは
% time ruby pstore_bench.rb 1000
ruby pstore_bench.rb 1000 1.67s user 0.44s system 99% cpu 2.119 total
% time ruby pstore_bench.rb 10000
ruby pstore_bench.rb 10000 3.24s user 0.63s system 99% cpu 3.876 total
% time ruby pstore_bench.rb 100000
ruby pstore_bench.rb 100000 14.29s user 3.13s system 100% cpu 17.416 total
となり、パフォーマンスの向上がみられました。
扱うデータのサイズが大きいほど差は開くものと思われます。
パッチを添付しました。
変更後もtest-allをパスします。
よろしくお願いします。
=end
--
http://redmine.ruby-lang.org