[ruby-dev:50155] [Ruby trunk Feature#6129][Closed] String#each_lineにおけるmemmem()の利用
From:
glass.saga@...
Date:
2017-06-22 07:01:32 UTC
List:
ruby-dev #50155
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/