From: "shyouhei (Shyouhei Urabe)" <shyouhei@...>
Date: 2012-05-29T11:18:55+09:00
Subject: [ruby-dev:45689] [ruby-trunk - Bug #6509][Assigned] String#gsub is too slow if receiver includes a binary


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

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
https://bugs.ruby-lang.org/issues/6509#change-26885

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



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