2004年08月31日

Location::GeoToolの高速化(2)

Posted by nene2001 at 19:45 / Tag(Edit): / 0 Comments: Post / View / 0 TrackBack このエントリーを含むはてなブックマーク

今度は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

Related query words in Google & Yahoo
Related Books from Amazon
Trackback to this entry
TrackBack URL :
Trackbacks
トラックバックはありません。
Comments
コメントはありません。
Post a comment












Remember personal info? 
2004年08月
Su Mo Tu We Th Fr Sa
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

About Me

Navigation

Search
Google
Web
kokogiko.net
Archives
Recent Entries
Recent Comments
Recent Trackbacks
『共通善は共有してはいけない』に一部解毒され、一部またもやもやした(ここギコ!)
右翼はアイヌや沖縄を包摂する論理を構築すべきではないのか
『共通善は共有してはいけない』に一部解毒され、一部またもやもやした(ここギコ!)
確信犯より無関心・無神経の方が根が深い大問題
"「次世代交通情報を考える」ブロガーミーティング"に参加(チミンモラスイ?)
AMNブロガーミーティング「ユビークリンク/全力案内!」に行ってきました。
Google未オルソ衛星画像にぶった切られた我が母校(ここギコ!)
未オルソ画像が生むジョジョの世界&MSNの航空写真はオルソされている?
AMNブロガーミーティング「ユビークリンク/全力案内!」に行ってきました。(ここギコ!)
あいまいな個人認証の技術ってないんだろうか
ジオメディア忘年会2008に行ってきた(近江商人JINBLOG)
ジオメディア忘年会行ってきました
ジオメディア忘年会 2008 を終えて(Cirius Lab. ブログ)
ジオメディア忘年会行ってきました
ジオメディア忘年会行ってきました(ここギコ!)
ジオメディア忘年会 新年会から始まり東京1、2、関西と続いたジオメディア2008の締めくくり
ジオメディア忘年会行ってきました(ここギコ!)
モーバイルインフォサーチ実験から続く想いの系譜
「Web 2008 Expo」行って来ました(ここギコ!)
コンテキストを検知できないモバイルWebなどあり得ない
Hatena bookmarked
My del.icio.us

Banners

Syndication
Powered by
Get it!!