Project

General

Profile

Actions

Feature #7368

closed

rb_str_each_line()のパフォーマンス向上とリファクタリング

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

Status:
Closed
Target version:
[ruby-dev:46523]

Description

rb_str_each_line()でmemmem(3)を使う事を[ruby-dev:45344] [Feature #6129]で提案しましたが、
string.cからmemmem(3)を直接使わずに検索をrb_memsearch()にまとめた上で、
検索文字列と被検索文字列の両方がvalidなencodingである場合と、そうでない場合に関数を分けてリファクタリングしたpatchを作りました。
(どちらかがinvalidな場合には、rb_enc_codepoint_len()で舐めていき途中でArgumentErrorを投げる必要があるので、旧来の処理を使う必要があります)

このpatchには以下の利点があります。

  • string.c側でmemmem(3)の有無を意識する必要がない

  • これまで検索文字列がrb_default_rsである場合にはrb_str_each_line()側でmemchr(3)を用いた最適化が施されていた(trunkのstring.cの6166行以降)が、
    rb_memsearch()を使えば検索文字列の長さに合わせて最適化された検索をしてくれるので、このような特別扱いが不要になる

  • 検索文字列と被検索文字列のencodingがvalidなら、検索文字列がrb_default_rsでない場合のパフォーマンスが向上する

  • これまでrb_str_each_line()の冒頭で宣言されていた多数の変数を分けた関数毎に局所化できるので、以前よりは読みやすくなる

また、以下のコードでベンチマークを取りました。

require 'benchmark'

str = "hogehifuga\n" * 100_0000

Benchmark.bm do |x|
x.report("default rs") do
10.times do
str.each_line {}
end
end

x.report("not default rs") do
10.times do
str.each_line("hi") {}
end
end
end

trunk(r37670):
user system total real
default rs 2.060000 0.000000 2.060000 ( 2.055412)
not default rs 3.700000 0.000000 3.700000 ( 3.698057)

proposed:
user system total real
default rs 2.100000 0.000000 2.100000 ( 2.095167)
not default rs 2.150000 0.000000 2.150000 ( 2.153824)

検索文字列がrb_default_rsな場合のパフォーマンスが低下していない事、検索文字列がrb_default_rsでない場合にはパフォーマンスが向上している事が確認できます。

手元ではtest-allが通っていますが、それなりにコードを削った上に関数を新設しているので、patchをレビューして頂けると大変助かります。
よろしくお願いします。


Files

patch.diff (5.43 KB) patch.diff Glass_saga (Masaki Matsushita), 11/16/2012 02:31 PM
patch2.diff (5.57 KB) patch2.diff Glass_saga (Masaki Matsushita), 11/20/2012 10:01 PM
patch3.diff (3.75 KB) patch3.diff Glass_saga (Masaki Matsushita), 06/28/2013 10:53 PM

Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #8698: レシーバに不正なバイト列が含まれている場合にString#each_lineや#linesの挙動が引数の有無で変わってしまうClosedGlass_saga (Masaki Matsushita)07/28/2013Actions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0