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