RubyのGeometry系ライブラリ - パース対決

投稿者 nanki 2007-03-06 18:29:00 GMT

必要だったのでベンチマーク対決してみた。 対象は、GEOS, GeoRuby, おまけで自分で実装したWKBパーサ。

GEOSは、JavaのJTSをC++に移植したもので、RubyのバインディングがSWIGで用意されている。

GeoRubyは、PureRuby実装。最近は、地図業界で使われることの多いShapeファイルや、xBaseファイルを扱うクラスも追加されたようだ。

最後のは、僕が初めてRubyで書いたまじめなコード。 大量のデータを処理する目的があったので、エラー処理もすっ飛ばして、可能な限り速く動くようにしてある。 中身はほとんどunpack<<[]

こんなコードで約二万件のMultiLineStringをパース。

# require やらARのモデル定義は省略
def benchmark
  roads = Road.find(:all).map{|road| road.the_geom[4..-1]}
  t = Time.now
  roads.each do |road|
    yield road
  end
  p Time.now - t
end
  
benchmark do |road|
  Geos::geom_from_wkb(road)
end
  
benchmark do |road|
  GeoRuby::SimpleFeatures::Geometry.from_ewkb(road)
end
  
benchmark do |road|
  Geometry::WKBParser.parse(road)
end

結果は、

0.375728  #Geos
5.319374  #GeoRuby
1.353812  #Geometry

やはりC++コードは速い。SWIGのオーバーヘッドはどれくらいなんだろう。

Rubyのコードもそこそこ。頑張れば数倍程度。思ったより遅くない。

さらに、YARVでもやってみた。 ActiveRecord は動かなかったので(大幅に仕様の変ったというsend でこけた時点であきらめた)Marshal.dumpしたデータを利用。 再コンパイルが面倒だったのと、実質のコードはほとんどRuby側じゃないのでGEOSは除外。

3.836262  #GeoRuby
0.699637  #Geometry

YARV速っ。

参考:

This entry was posted on 2007-03-06 18:29:00 GMT and カテゴリ , . You can follow any response to this entry through the Atom feed. or a trackback from your own site.

タグ , , ,


トラックバック

トラックバックリンク:
http://blog.netswitch.jp/trackbacks?article_id=8062