2004年08月31日
Location::GeoToolの高速化(2)
今度はTipsではなく、内部コードの変更です。
6%程度の高速化しかできなかったですが…。
英語版ドキュメント等を用意する余裕がないので言及してませんが、Location::GeoToolには動的に経緯度記述フォーマットや測地系、方位角毎の方角名を動的にユーザ定義できる機構があります。
追ってまたドキュメントも揃えますが、興味のある方はソース中のset_original_format、set_original_datum、set_original_dirstrあたりを覗いてみてください。
で、その機構を備えているために、動的に追加された測地系やフォーマットにもdatum_xxx、format_xxxといったメソッドで対応するため、実はその手のメソッドは全てAUTOLOADで対応しておりました。
しかしデフォルトで導入されている測地系・フォーマットまで負荷の高いらしい?AUTOLOADで対応するのは、確かに作るほうは楽なんですがあまりにもいい加減かなと思い、デフォルト分は固定メソッドとして作っておく事にしました(当然?)。
また、動的に追加された測地系・フォーマットのメソッドも、標準じゃないからと言ってずっとAUTOLOADで扱うのもアレなので、メモリ上にクラスがロードされた後、最初の呼び出しはAUTOLOADが受けますが、その後は型グロブにサブルーチンリファレンスを登録して、動的に固定メソッドを追加する事にしました。
今まで
sub AUTOLOAD
{
my $self = shift;
my $method = $AUTOLOAD;
$method =~ s/.+://;
return if ($method eq "DESTROY");
if ($method =~ /^format_(\w+)$/) # changing format
{
return $self->_exec_change($self->out_datum,$1,0);
以下略…
こんな感じだったのを、
sub AUTOLOAD
{
my $self = shift;
…中略…
if ($method =~ /^format_(\w+)$/) # changing format
{
eval qq{no strict 'refs';*{"Location::GeoTool\\::$method"} = sub { \$_[0]->_exec_change(\$_[0]->out_datum,'$1',0);};};
return $self->$method();
以下略…
こんな感じ。
実際にどの程度パフォーマンス差が出るのか、また実験してみた。
ずっとAUTOLOADで処理をさせた例と、1回目呼び出しだけAUTOLOADで2回目以降型グロブに登録する例、最初から固定メソッドを記述しておく例、それぞれで測地系変換とフォーマット変換を1回ずつかけた処理20万回のループを、2試行やってみた。
結果は以下の通り。
AUTOLOAD
200000 loops of code took:78 wallclock secs (76.13 usr + 0.02 sys = 76.14 CPU) @ 2626.71/s (n=200000)
200000 loops of code took:78 wallclock secs (76.14 usr + 0.05 sys = 76.19 CPU) @ 2625.09/s (n=200000)AUTOLOAD-ADD
200000 loops of code took:73 wallclock secs (71.78 usr + 0.01 sys = 71.80 CPU) @ 2785.63/s (n=200000)
200000 loops of code took:72 wallclock secs (71.72 usr + 0.03 sys = 71.75 CPU) @ 2787.46/s (n=200000)SOLID
200000 loops of code took:73 wallclock secs (71.03 usr + 0.05 sys = 71.08 CPU) @ 2813.77/s (n=200000)
200000 loops of code took:71 wallclock secs (70.98 usr + 0.06 sys = 71.05 CPU) @ 2815.04/s (n=200000)
全部AUTOLOADに比べて、1回目AUTOLOAD・型グロブ追加方式で6%、完全固定メソッド方式で7%程度の速度向上。
6%と7%の差なら、なんかいっぱいごちゃごちゃしたコードがソースに入っていると何となく格好悪いので、全部AUTOLOAD・型グロブ追加方式でもいいかなと思いもするけど、ただでさえ全般的に重いので、一応デフォルトデータに関しては固定でメソッドを用意するようにしよう。
これで、多少はマシになるだろうか。
Posted with ecto
![[ここギコ!]](http://kokogiko.net/logo.png)



・滝川クリステル?(DatingGenious)
・コンピュータは2進法が効率的でとかいう話(XAGary)
・コンピュータは2進法が効率的でとかいう話(とおりすがり)
・ジオメディア忘年会行ってきました(宋さんへ:kokogiko)
・コンピュータは2進法が効率的でとかいう話(kokogiko)
・コンピュータは2進法が効率的でとかいう話(まぐろ)
・コンピュータは2進法が効率的でとかいう話(名無し)
・コンピュータは2進法が効率的でとかいう話(dokasen)
・コンピュータは2進法が効率的でとかいう話(dokasen)