Google Sparse Hash Map

Google Sparse Hash Mapってどんなもんなんだろう?って思ってちょっと調べてみた。
http://goog-sparsehash.sourceforge.net/
documentがSGISTLに合わせてあるらしいんだけど、統一されると既にSGISTLを知っている人にはとても嬉しいんだろうなぁ。。


消費メモリが少ないけど処理速度が犠牲にしたのがsparse系で、
その逆で消費メモリは多めだけど、処理速度を追求したのがdense系。
濃い薄いっていうのは値を格納する骨組みの事をイメージしてるのかな?
setとmapの違いは、setはkeyとvalueが同じで、mapはpairで格納するkeyとvalueが異なる。
hash関数を使うので、要素の並び順を規定したい場合は、違うcontainerのが良いらしい。
sparsetableは、消費メモリをけちった配列という感じっぽい。



気になるのは標準のstd::mapと比較した時のperformanceで
http://goog-sparsehash.sourceforge.net/doc/performance.html
を見てみると、とっても良い感じ。


http://groups-beta.google.com/group/google-sparsehash/browse_thread/thread/a95daaf8769da17b/5403eeb8b1828349
を見てみるとVC7.1で使えるようにalexisさんという人が改造したようで、
それをちょっと自分の環境でもbuildしてbenchmarkを取ってみた。


自分の貧弱な環境では1千万回も回していたら動作がいつ終わるかわからないし、
Memoryも溢れてしまうので、5万回くらいにした。STANDARD MAPのところで、
benchmarkの時間以上に異様に長い時間止まってしまうのは謎。なんでだろう…。

[ WCPUID Version 3.3  (c) 1996-2004  By H.Oda! ]

  Processor #1 : AMD Athlon XP (Model 6) / 8253754B
      Platform : Socket A (Socket 462)     
 Vendor String : AuthenticAMD
      CPU Type : Original OEM Processor (0)
        Family : 6  (7)
         Model : 6  (6)
   Stepping ID : 2  (2)
      Brand ID : -  (-)
          APIC : ----
HT Log.CPU Cnt : ----
   Name String : AMD Athlon(tm) XP 1500+

Internal Clock : 1333.37 MHz
    System Bus :  266.67 MHz DDR
  System Clock :  133.34 MHz
    Multiplier :   10.0  

    L1 I-Cache :   64K Byte
    L1 D-Cache :   64K Byte
    L1 T-Cache :  ----
    L1  Cache  :  ----
    L2  Cache  :  256K Byte
    L2  Speed  : 1333.37 MHz (Full)

    MMX   Unit : Supported
    SSE   Unit : Supported
   SSE2   Unit : Not Supported
   SSE3   Unit : Not Supported
   MMX2   Unit : Supported
  3DNow!  Unit : Supported
  3DNow!+ Unit : Supported

   Host Bridge : 1022:700E.13 [AMD-761]
  South Bridge : 1106:0686.40 [VIA VT82C686B]
    VGA Device : 1002:4150.00 [ATI RADEON 9600 Series]
  Memory  Size : 512M Byte
  Memory Clock : ----

    OS Version : Windows XP  Version 5.1.2600 Service Pack 2

======
Hardware information:
  OEM ID: 0
  Number of processors: 1
  Page size: 4096
  Processor type: 586
  Minimum application address: 10000
  Maximum application address: 7ffeffff
  Active processor mask: 1
Average over 50000 iterations
2005/05/08

SPARSE_HASH_MAP:
map_grow              2175.42 ns
Memory used              1.5 Mb
map_predict/grow      1194.02 ns
map_replace            289.32 ns
map_fetch              260.88 ns
map_remove             370.25 ns

DENSE_HASH_MAP:
map_grow               269.91 ns
Memory used              2.1 Mb
map_predict/grow        57.10 ns
map_replace             44.37 ns
map_fetch               44.45 ns
map_remove              47.91 ns

STANDARD HASH_MAP:
map_grow             43102.15 ns
Memory used              3.1 Mb
map_predict/grow      2724.64 ns
map_replace            181.75 ns
map_fetch              172.35 ns
map_remove           27973.22 ns

STANDARD MAP:
map_grow              2512.32 ns
Memory used              3.4 Mb
map_predict/grow      2922.49 ns
map_replace            353.18 ns
map_fetch              319.60 ns
map_remove           20146.23 ns


標準のmapよりかなり良さげだけど、要素によってはhash関数を別途用意しなければ
いけないので、極端にデータ数が多い時じゃなければ普通のmapでいいやぁ。。
何だか比較する興味心はあるけど、実際やる気はあんまり無いという事だろうか。(汗
でもデータ件数がとっても多い本格的なデータ処理する時は使ってみよう。