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