Project

General

Profile

Actions

Feature #6173

closed

re.cのrb_memsearch()におけるmemchr()の利用

Added by Glass_saga (Masaki Matsushita) about 10 years ago. Updated over 9 years ago.

Status:
Closed
Priority:
Normal
Target version:
[ruby-dev:45397]

Description

re.cのrb_memsearch()では、m == 1な場合にはfor文で各バイトと比較していますが、memchr()を用いると性能の改善がみられます。
次のようなベンチマークを実行したところ、以下のような結果となりました。

require 'benchmark'

str = "hoge" * 10000 + "\n"

Benchmark.bm do |x|
x.report do
str.index("\n")
end
end

trunk(r35083):
user system total real
0.000000 0.000000 0.000000 ( 0.000185)

proposal:
user system total real
0.000000 0.000000 0.000000 ( 0.000018)

patchを添付します。


Files

patch.diff (532 Bytes) patch.diff Glass_saga (Masaki Matsushita), 03/18/2012 11:14 PM
patch2.diff (530 Bytes) patch2.diff Glass_saga (Masaki Matsushita), 03/19/2012 12:10 AM

Updated by Glass_saga (Masaki Matsushita) about 10 years ago

特に添字を使う意味もなかったのでpatchを修正しました。

Updated by Glass_saga (Masaki Matsushita) about 10 years ago

optflags='-O0 -g'を付けてビルドしたtrunkを使っていたので、ベンチマークでproposalが不当に有利でした。
optflagsを外してビルドした上でベンチマークを取り直したところ、以下の結果となりました。

trunk(r35087):
user system total real
0.000000 0.000000 0.000000 ( 0.000049)
proposal:
user system total real
0.000000 0.000000 0.000000 ( 0.000019)

Updated by mame (Yusuke Endoh) about 10 years ago

  • Status changed from Open to Assigned
  • Assignee set to matz (Yukihiro Matsumoto)

パッチは、まあいいんじゃないでしょうかね。

Glass_saga さんが登録したチケットで accept されそうなのが何個か
見当たるっぽいので、コミット権あげると楽な気がしますが、どんなもんでしょう。
ChangeLog には 8 回くらい名前が載ってるみたいです。

という意味で matz にアサイン。

--
Yusuke Endoh

Updated by ko1 (Koichi Sasada) over 9 years ago

パッチの判断は中田さん,お願い出来ますか&コミット頂けませんか.
コミッタ権の判断は,まつもとさんでもいいんですが,多分反対は無さそうですが.

Updated by Glass_saga (Masaki Matsushita) over 9 years ago

ベンチマークの負荷が小さすぎて非常に短い時間で終わってしまい、他の要因に左右されている可能性を否定できないと思ったので、
文字列の大きさと繰り返し回数を増やしてベンチマークを取り直しました。

require 'benchmark'

str = " " * 10_0000 + "\n"

Benchmark.bm do |x|
x.report do
10000.times do
str.index("\n")
end
end
end

trunk(r37428):
user system total real
0.940000 0.000000 0.940000 ( 0.933771)

proposal:
user system total real
0.090000 0.000000 0.090000 ( 0.093609)

十分なパフォーマンスの向上がみられたので、反対がなければ取り込んでコミットしようと思います。

Actions #6

Updated by Anonymous over 9 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r37564.
Masaki, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


Actions

Also available in: Atom PDF