2004年08月31日

Location::GeoToolの高速化(1)

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

Location::GeoToolの動作の重さがどうにかならないかという事に関して、利用者の方から示唆をいただいたりした事も有り、ちょっといくつか試して見ました。

その1としては、オブジェクトの生成に時間がかかっているのではないか、という指摘。
1つ2つの経緯度処理なら全く問題ないのだけど、何万何千と言う位置情報を処理するのに、いちいちオブジェクトを生成していては非常に処理が遅くなるのが問題。
解決方法としては、Jcodeのsetメソッドのように、オブジェクトの生成は行わずに、既存オブジェクトの中身だけ置き換えるメソッドを準備すれば、早くなるのではないかという示唆があって、実際示唆してくださった方はそういう拡張を行ってテストしてみてくださったのですが、100万件回して、毎回オブジェクト生成だと30秒弱、使いまわしだと10秒弱ですんだ、との事。

さっそくその結果を実装に反映しようと見てみると…随分前に作って忘れてたけど、よく見るとコンストラクタのcreate_coordって、クラスメソッドとしてもオブジェクトメソッドとしても呼べるように作ってあるわ…。

sub create_coord3d
{
my $self = shift;
$self = $self->_new() unless (ref($self)); <-このあたり
@{$self}{qw(lat long alt def_datum def_format source)} = @_;

当時はオブジェクト生成時の実行コストとか全く考えてなかったんで本当にたまたまなんだけど、これで改造しなくてもオブジェクトの使いまわしができますね。

というわけで、1つ目のLocation::GeoTool高速化としては、モジュール側の改造ではなく利用者側のTipsとして、
・大量の点を処理する場合は、create_coordオブジェクトはクラスメソッドとして呼ぶのではなく、オブジェクトメソッドとして、オブジェクトの使いまわしをする事
という結果が判りました。

試しにこちらでもテストしてみました。
20万回、都度オブジェクト生成とオブジェクト使い回しでテストしてみると、
テストコード:

use Location::GeoTool;
use Benchmark qw(timethese);

timethese 1, {
'each_create' => sub {
for($i = 0; $i < 200000; $i++) {
Location::GeoTool->create_coord("35.00.00.000","135.00.00.000","wgs84","gpsone");
}
},
'obj_persist1' => sub {
my $obj = 'Location::GeoTool';
for($i = 0; $i < 200000; $i++) {
$obj = $obj->create_coord("35.00.00.000","135.00.00.000","wgs84","gpsone");
}
},
'obj_persist2' => sub {
my $obj = Location::GeoTool->create_coord("35.00.00.000","135.00.00.000","wgs84","gpsone");
for($i = 0; $i < 199999; $i++) {
$obj->create_coord("35.00.00.000","135.00.00.000","wgs84","gpsone");
}
},
}


結果:
Benchmark: timing 1 iterations of each_create, obj_persist1, obj_persist2...
each_create: 8 wallclock secs ( 7.77 usr + 0.00 sys = 7.77 CPU) @ 0.13/s (n=1)
obj_persist1: 3 wallclock secs ( 3.42 usr + 0.00 sys = 3.42 CPU) @ 0.29/s (n=1)
obj_persist2: 4 wallclock secs ( 3.28 usr + 0.00 sys = 3.28 CPU) @ 0.30/s (n=1)

というわけで、オブジェクト使い回しで倍近いパフォーマンスが出ました。

面白かったのは、$obj=$obj->…等と中身の移し変えをするだけでも、20万回も回すと結構なパフォーマンス差が出てる事。
論理上一緒だから書き易い方がいいだろう、とか、そんな安易なアレであんまり楽しすぎないほうがいいって事ですね。

でも、大元のオブジェクトは使い回せばいいとしても、OOP実現のためにいちいち生成しているオブジェクトはどうしよう。
例えば、$obj->format_mapion->datum_wgs84->arrayなんかの時の、format_mapion、datum_wgs84等のメソッド実行毎に生成しているオブジェクトの事。
こういうインタフェースのOOPをやろうと思えば、どうしてもオブジェクトを新規に生成せざるを得ない。
インターフェース的に参考にしたJcodeはどうしてるのかなあ…と見てみたら、結構すごい事やってた…。
Jcodeの場合、$obj->h2z->sjisとかやった場合、普通直感的には$objの内容自体は変化なく保存されると思うが、h2z を実行した時点で$objの中身そのものを修正し、その結果をメソッド戻り値として返している(つまりオブジェクトの新規生成コストはない)という実装になってた。
あまりにも非直感的だけど、Jcode的な用途の場合一方通行の変換が主なので、こういうのもありなのかなと。
でもLocation::GeoToolの場合、中央の1点をオブジェクトにして、そこを基準にその周辺数点の位置を計算したい、といった要件もありがちなので、メソッドに依存してオブジェクトが内容が変わってしまっても困る。
勢い、新規オブジェクトを生成せざるを得ず、実行コストが高まってしまう。

うーん、どうしたもんかね。

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!!