utf8_heavy.pl について

社内で配信システムのパフォーマンス検証をDevel::NYTProfを利用して先日行ってましたが、
結果、多くの配信リクエストにutf8_heavy.plというツールがロードされていて、動作コストを食う一因となっていた事を確認していました。

明示的にロードしていないはずのutf8_heavy.plが、どのような状況でロードされるのか、ひととおりの理解ができたと思ったので、自分のメモとして残しておこうと思いました。

自分の理解では、
utf8フラグが立った文字列に対してある処理を行う際、
Unicodeデータを内部的に処理するためのデータ構造の
swatchswashを生成するために、
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に注目するのも一つの方法だと感じました。

内容的に間違いがありましたら、ご指摘いただければ、ありがたく思います。
宜しくお願い致します。