[ruby-trunk - Bug #6509][Open] String#gsub is too slow if receiver includes a binary

Issue #6509 has been reported by okkez (okkez _).


Bug #6509: String#gsub is too slow if receiver includes a binary

Author: okkez (okkez _)
Status: Open
Priority: Normal
Assignee:
Category: core
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-05-28 trunk 35830) [x86_64-linux]

=begin

以下のようなコードで String#gsub が遅くなります。

  • b = “” の場合(A): 0.2840230464935303
  • b = “\xB9” の場合(B): 4.183771848678589

-- coding: utf-8 --

a = (“abcde\n”*50000).force_encoding(“binary”)
#b = “”
b = “\xB9”.force_encoding(“binary”)
c = (“efghi\n”*50000).force_encoding(“binary”)

d = “#{a}#{b}#{c}”

start = Time.now.to_f
d.gsub(/\n/) { “” }
puts(Time.now.to_f - start)

それぞれの場合で、プロファイルを取ってみたので添付します。

(B)の場合に、search_nonascii を約20万回呼び出して処理時間の92%を費しています。
(A)の場合は、約10万回しか呼び出しておらず、処理時間も短いです。

=end

Issue #6509 has been updated by shyouhei (Shyouhei U.).

Category changed from core to M17N
Status changed from Open to Assigned
Assignee set to naruse (Yui NARUSE)

str_gsubの中でdestが一回non
asciiになってしまったらそれ以降はsearch_nonasciiしても無駄という気がしますが専門家のご意見をうかがいたいところです。

Bug #6509: String#gsub is too slow if receiver includes a binary

Author: okkez (okkez _)
Status: Assigned
Priority: Normal
Assignee: naruse (Yui NARUSE)
Category: M17N
Target version: 2.0.0
ruby -v: ruby 2.0.0dev (2012-05-28 trunk 35830) [x86_64-linux]

=begin

以下のようなコードで String#gsub が遅くなります。

  • b = “” の場合(A): 0.2840230464935303
  • b = “\xB9” の場合(B): 4.183771848678589

-- coding: utf-8 --

a = (“abcde\n”*50000).force_encoding(“binary”)
#b = “”
b = “\xB9”.force_encoding(“binary”)
c = (“efghi\n”*50000).force_encoding(“binary”)

d = “#{a}#{b}#{c}”

start = Time.now.to_f
d.gsub(/\n/) { “” }
puts(Time.now.to_f - start)

それぞれの場合で、プロファイルを取ってみたので添付します。

(B)の場合に、search_nonascii を約20万回呼び出して処理時間の92%を費しています。
(A)の場合は、約10万回しか呼び出しておらず、処理時間も短いです。

=end