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/