Sparse Hash: Linuxでの測定

http://storehouse.sakura.ne.jp/viewvc/viewvc.cgi/ruby-sparsehash/ext/sparsehash.cpp?root=svn&view=markup
Linux上だと実用的な速度に見えなくもない。


[root@andLinux ruby-sparsehash]# ruby test.rb SparseHashMap 1000000
Sparsehash::SparseHashMap: 1000000
Time: 28.380 sec.
Usage: 181.996 MB
[root@andLinux ruby-sparsehash]# ruby test.rb Hash 1000000
Hash: 1000000
Time: 16.580 sec.
Usage: 238.391 MB

C++でいくつか嵌ったのでメモ。

  • 相変わらずtypenameの罠に嵌る。イテレータが出てきたら要注意
  • have_library('stdc++')を呼ばないと実行時にエラー
  • テンプレート関数をrb_define_methodに渡そうとしたら、うまくいかず。とりあえずクラスを作っておいた方がよいみたい
  • g++だとなぜか前方参照になっているような
  • 部分的な処理の特殊化は関数オブジェクトが役に立つ
  • VCで関数オブジェクトのstaticメンバ作ったら、なぜかコンパイルできず
  • せっかく名前空間があるんだから、関数名は短い方がいいと思う


↓のコードは一つにまとめたいなー。

template <>
struct sparsehash_initialize<DHMap> {
  void operator() (DHMap *x) {
    x->set_empty_key(Qnil);
  }
};

template <>
struct sparsehash_initialize<DHSet> {
  void operator() (DHSet *x) {
    x->set_empty_key(Qnil);
  }
};


追記
Setならもっと効果がでるかも、と思ってテスト。


[root@andLinux ruby-sparsehash]# ruby -r set test.rb Set 1000000
Set: 1000000
Time: 16.860 sec.
Usage: 179.445 MB
[root@andLinux ruby-sparsehash]# ruby test.rb SparseHashSet 1000000
Sparsehash::SparseHashSet: 1000000
Time: 20.590 sec.
Usage: 164.465 MB
[root@andLinux ruby-sparsehash]# ruby test.rb DenseHashSet 1000000
Sparsehash::DenseHashSet: 1000000
Time: 27.860 sec.
Usage: 163.664 MB
うーん…


追記2
GNU HashMapを使ってみる。


[root@andLinux ruby-sparsehash]# ruby test.rb Hash 1000000
Hash: 1000000
Time: 16.180 sec.
Usage: 238.383 MB
[root@andLinux ruby-sparsehash]# ruby test.rb Map 1000000
STL::Map: 1000000
Time: 29.190 sec.
Usage: 186.168 MB
[root@andLinux ruby-sparsehash]# ruby test.rb HashMap 1000000
GNU::HashMap: 1000000
Time: 18.430 sec.
Usage: 176.906 MB