From: masayoshi takahashi Date: 2008-09-15T12:52:21+09:00 Subject: [ruby-dev:36302] Re: [patch] performance improvement patch for benchmark/bm_so_count_words.rb 高橋征義です。 2008/09/15 12:35 Yukihiro Matsumoto : > |1.9でbenchmarkを走らせたところ、bm_so_count_wordsの結果がひどかった > |(1.8のときより30倍くらい遅くなる)ので、パッチを書いてみました。 > |基本的にはsinglebyteの時にエンコーディングを気にせず、1.8の時の > |コードのように処理させるものです。これでも1.8の2倍程度の時間は > |かかってしまうようですが(Mac OS X 10.5.4)。 > > ああ、今日、原稿をしあげたら取り掛かろうと思っていたのに。 すみません:) あと、昨日話していたdowncaseがボトルネックになっていた件は、 別のshootoutの実装でのサンプルでした。 > |あと、single_byte_optimizable(str) に、rb_enc_str_asciionly_p(str) を > |加えてしまってもいいのでしょうか? 一般に加えてしまってよいのか > |よく分からなかったので、このpatchでは、 > | if (single_byte_optimizable(str) || rb_enc_str_asciionly_p(str)) { > |などという形で判別するようにしています。 > > single_byte_optimizable()は > > mbmaxlenが1 > またはENC_CODERANGE_7BIT > > の時真になり、 > > rb_enc_str_asciionly_p()は > > asciicompatibleであり(mbminlenが1でdummyではない)、 > かつENC_CODERANGE_7BIT > > なので、なんか似たような条件になってます。微妙に違うのがなぜ > だかよくわからないのですが、どっちかで十分ではないかと思いま > す。 1.9では、asciiだけのファイルを読み込む場合でも、読み込んだ 文字列のencodingはデフォルトでUTF-8になるようなので、現状の single_byte_optimizable() では真になりません(ので困った)。また、 rb_enc_str_asciionly_p() のみでは、ASCII-8BITでは真にならない ような気がするので、両方の条件を混ぜたようなものが 必要になるのではないかと。 ちなみにやりたいのは、文字列を走査する際に、singlebyteずつ 走査すればよいかどうかのための判別条件のつもりです。 > |singlebyteの時だけ早くなってどーする、と意見もあるかと > |思いますが、ないよりはマシかと思うので、よろしくお願いします。 > > いや、singlebyteの時に速いのは重要だと思います。ちょっとチェッ > クしてからコミットしましょう。 いまいち合ってるか自信ないので、よろしく確認していただければ。 高橋征義 (takahashimm@gmail.com)