Issue #6129 has been updated by Glass_saga (Masaki Matsushita).

Status changed from Assigned to Closed
Assignee changed from nobu (Nobuyoshi Nakada) to Glass_saga (Masaki Matsushita)

trunkでは既にrb_memsearch()を利用するようになっているため、このチケットは閉じます。

----------------------------------------
Feature #6129: String#each_lineにおけるmemmem()の利用
https://bugs.ruby-lang.org/issues/6129#change-65439

* Author: Glass_saga (Masaki Matsushita)
* Status: Closed
* Priority: Normal
* Assignee: Glass_saga (Masaki Matsushita)
* Target version: next minor
----------------------------------------
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)
patch2.diff (4.12 KB)


-- 
https://bugs.ruby-lang.org/