어설픈 C++보다는 Java의 성능이 오히려 뛰어나 전에 놀랐던 기억에 이번 구현할 프로그램에서는 라이브러리 벤치마킹부터 하고 들어가기로 했다. 뭐 한두 시간 안에 해야 할 거니 너무 거창하게 할 순 없고 간단한 Map 클래스 성능 테스트만... 우연히 발견한 Google sparse map과 dense map 클래스, 그리고 STL map 클래스. 한 100,000개 정도의 정수 만 가지고 random build, random probing, 그리고 iteration 으로 대충 테스트 해보았다.
Sparse Map: Insertion TM: 0.09 sec, Search TM: 0.11 sec, Iteration TM: 0 sec
Dense Map: Insertion TM: 0.03 sec, Search TM: 0.02 sec, Iteration TM: 0.02 sec
STL Map: Insertion TM: 0.06 sec, Search TM: 0.12 sec, Iteration TM: 0.03 sec
전체 Map iostream으로 save: 0.49 sec
전체 Map C fprintf로 save: 0.11 sec
Sparse map은 매우 memory efficient 하여 한 엔트리당 1`2 bits
Dense map은 빠른 대신 데이터 크기의 2~3배 오버헤드?
google sparse hash distribution의 공식 documentation에 있는 내용과 크게 다르지 않다.
Sparse Map: Insertion TM: 0.09 sec, Search TM: 0.11 sec, Iteration TM: 0 sec
Dense Map: Insertion TM: 0.03 sec, Search TM: 0.02 sec, Iteration TM: 0.02 sec
STL Map: Insertion TM: 0.06 sec, Search TM: 0.12 sec, Iteration TM: 0.03 sec
전체 Map iostream으로 save: 0.49 sec
전체 Map C fprintf로 save: 0.11 sec
Sparse map은 매우 memory efficient 하여 한 엔트리당 1`2 bits
Dense map은 빠른 대신 데이터 크기의 2~3배 오버헤드?
google sparse hash distribution의 공식 documentation에 있는 내용과 크게 다르지 않다.
Average over 10000000 iterations
SPARSE_HASH_MAP:
map_grow 665 ns
map_predict/grow 303 ns
map_replace 177 ns
map_fetch 117 ns
map_remove 192 ns
memory used in map_grow 84.3956 Mbytes
DENSE_HASH_MAP:
map_grow 84 ns
map_predict/grow 22 ns
map_replace 18 ns
map_fetch 13 ns
map_remove 23 ns
memory used in map_grow 256.0000 Mbytes
STANDARD HASH_MAP:
map_grow 162 ns
map_predict/grow 107 ns
map_replace 44 ns
map_fetch 22 ns
map_remove 124 ns
memory used in map_grow 204.1643 Mbytes
STANDARD MAP:
map_grow 297 ns
map_predict/grow 282 ns
map_replace 113 ns
map_fetch 113 ns
map_remove 238 ns
memory used in map_grow 236.8081 Mbytes
SGI STL implementaion의 메모리 usage가 dense hash map에 비해
크게 차이 없으므로 전체적인 결과는 일단 dense hash map에 맞춰 구현하되
나중에 다른 구현을 지정할 수 있도록 해야겠다.


Powerd by Tattertools.com