先日の記事
いまさらgrepが10倍高速化したのはなぜか
が思わぬ閲覧数を稼いでしまい、トルコ語の知識を日本に広めるのに大きな貢献をしたような気がしますが、みなさんいかがお過ごしでしょうか。
実は先日の記事を書いた時にはすでに2.18がリリースされてたのだが、今回は2.17のときと違って日本の大手メディアが取り上げてなかったので、ついつい見落としていた。しかし実は2.18でも大きな変更が!!
リリースノート抜粋:
grep -i in a multibyte, non-UTF8 locale could be up to 200 times slower
than in 2.16. [bug introduced in grep-2.17]
なんということでしょう。-iオプションでUTF8のときは2.17で10倍速くなっていたのだが、それ以外のマルチバイトロケールのときは200倍遅くなっていた。退化の原因は、2.17で加えられた変更そのものだった。
関連するコミットはこれ:
http://git.savannah.gnu.org/cgit/grep.git/commit/?id=c7c8bcdefe7be5f59a242eea63df7f64eacb6a09
テストはja_JP.eucJPでやっている(日本語のこと気にしてくれてありがとう!)
つまり流れとしては以下のとおり。
UTF8の場合、検索文字列を正規表現になおしてから検索したほうが10倍速くなったので、そのような変更をした(バージョン2.17としてリリース)
↓
上記の変更でUTF8以外のとき、200倍遅くなっていた
↓
UTF8以外のマルチバイトのときは、正規表現変換はせずに、従来の方法で検索するように変更(バージョン2.18としてリリース)
つまり、現在の実装としては、UTF8のときは検索文字列を正規表現に変換し、それ以外マルチバイトロケールの場合はテキストの方を変換してから検索することになっている。先日説明したトルコ語のI,i問題(あるいはトルコ語以外でも言語によっては大文字小文字でバイト数が違う問題)は、UTF8以外では発生しないらしい。
文字コードの世界、深すぎる…
追記:
2014/2/26 23:15 全体的にバージョン番号が間違ってたので直しました。
ピンバック: ヘッドラインニュース 2014/02/27(木) 16時39分 一番お得なのは?!新サービス「LINE電話」vs「楽天電話」vs「SMARTalk」vs「050plus」