Project

General

Profile

Feature #6129

String#each_lineにおけるmemmem()の利用

Added by Glass_saga (Masaki Matsushita) over 8 years ago. Updated about 3 years ago.

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

Description

memmem()というGNU拡張のライブラリ関数がありますが、string.cのrb_str_each_line()で可能であればこのmemmem()を利用する事を提案します。

次のベンチマークを実行しました。

require 'benchmark'

str = "hogehifuga" * 100_0000

Benchmark.bm do |x|
x.report do
str.each_line("hi") {}
end
end

結果:

trunk(r34969):

   user     system      total        real  

0.790000 0.000000 0.790000 ( 0.795141)

   user     system      total        real  

0.790000 0.000000 0.790000 ( 0.795141)

   user     system      total        real  

0.790000 0.000000 0.790000 ( 0.795141)

proposal:

   user     system      total        real   

0.510000 0.000000 0.510000 ( 0.507389)

   user     system      total        real  

0.530000 0.000000 0.530000 ( 0.541944)

   user     system      total        real   

0.520000 0.000000 0.520000 ( 0.522825)

以上のように、memmem()を利用する事でパフォーマンスの改善が見られます。
但し、改行文字がrb_default_rsと同一である場合には既にmemchr()を用いた高速な検索が行われるようになっている為、
パフォーマンスが改善されるのはrb_default_rs以外の改行文字を指定した場合のみです。

patchを添付します。


Files

patch.diff (2.7 KB) patch.diff Glass_saga (Masaki Matsushita), 03/11/2012 11:35 PM
patch2.diff (4.12 KB) patch2.diff Glass_saga (Masaki Matsushita), 03/18/2012 05:23 PM

Also available in: Atom PDF