utf8_heavy.pl について
社内で配信システムのパフォーマンス検証をDevel::NYTProfを利用して先日行ってましたが、
結果、多くの配信リクエストにutf8_heavy.plというツールがロードされていて、動作コストを食う一因となっていた事を確認していました。
明示的にロードしていないはずのutf8_heavy.plが、どのような状況でロードされるのか、ひととおりの理解ができたと思ったので、自分のメモとして残しておこうと思いました。
自分の理解では、
utf8フラグが立った文字列に対してある処理を行う際、
Unicodeデータを内部的に処理するためのデータ構造の
swatchとswashを生成するために、
utf8_heavy.plで定義されたSWASHGETメソッドが呼び出されていると理解しました。
参考ページ
http://homepage1.nifty.com/nomenclator/perl/swash.htm
おこりうるケースと例を想定 (1)文字プロパティ (\p{ }, \P{ })を用いた正規表現を利用した場合 use strict; use warnings; use utf8; my $string = '超ハラ減ったし'; my @list = ( $string =~ m/ ( \p{N}+ | \p{Han}+ | \p{Hiragana} | \p{Katakana} ) /gxmso ); print join ( ',', @list ); (2)受け取った文字列をdecodeしてutf8フラグを立てた後に、 urlエンコードをしたり、文字のマッチング(\wや\Wや\D等)や 文字の加工 (tr///, y///, uc, lc, ucfirst, lcfirst, \U, \L, \u, \l) を行った場合 use Encode; use strict; my $text = decode('utf8', '超ハラ減ったし'); $text =~ s/([^\w ])/'%'.unpack('H2', $1)/eg; $text =~ tr/ /+/; print $text;
いずれの例でも-dオプションをつけて、perlを実効したところ、utf8_heavy.plがロードされている事を確認しました。
対処法としてこれまで、urlエンコードに使っていたunpack関数をURI::Escapeにしてみたりして、
正規表現も別の方法に変えてみたりして対応しました。
配信処理のパフォーマンスを少しでも上げたい場合、
ロードされているutf8_heavy.plに注目するのも一つの方法だと感じました。
内容的に間違いがありましたら、ご指摘いただければ、ありがたく思います。
宜しくお願い致します。