admin write
blogbloglocation loglocation logtag listtag listguest bookguest book
Add to favoritesrss feed

Map class

2008/01/07 07:18
어설픈 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에 있는 내용과 크게 다르지 않다.
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에 맞춰 구현하되
나중에 다른 구현을 지정할 수 있도록 해야겠다.


Creative Commons License

트랙백 보낼 주소 :: http://devnuri.com/trackback/4

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

오랜만에 C++ 을 써야 할 거 같아서 이번에 linux에서 좀 더 개발 환경을 잘 셋팅세팅해 볼까 하고 C++이랑 궁합이 잘 맞는 에디터편집기를 조사를 좀 해봤다. 상용이나 여러 플랫폼에서 이용 가능하지 않을 걸 제외하고 나니 대충 남는 게 Vim, Emacs 랑Emacs랑 CDT? 셋팅세팅이 가벼운 걸로 하려고 보니 역시 Vim 인 듯Vim인 듯. 잠시 동안의잠깐의 복습을 통해 보니 역시
  • 마우스에 손을 델 필요가 없는 키보드 별천지의 그 맛
  • linux 환경과의 자연스러운 융화
는 Vi 계열을 따라 올따라올 자가 없는 듯 하다듯하다. 처음엔 WISWYG 계열 에디터편집기를를 오래 쓰던 습관 대로습관대로 커서나 마우스에 자동 손이 가더니 한두 시간 정도의 적응 과정을 거치고 나니 가끔 마우스로 가는 손이 그렇게 무겁게 느껴질 수가 없다. 창 전환 조차도전환조차도 큰 동작처럼 느껴지는 이 게으름의 맛(?)이란! 하지만 고급 기능을 몰라서 인 지몰라서인 지 몇 가지 Eclipse에서 쓰던 기능들이 아쉽다. 뭐 auto completion 기능 같은 것도 내가 사랑하는 기능이기는 하지만 그래. 없어도 뭐. 정말 아쉬운 기능들은
  • refactoring 기능. 예를 들어 변수나 펑션 이름을 바꾼다고 할 때 단순히 텍스트 레벨의 치환이 아닌 context를 인식한 replace 기능은 정말 아쉽다.
  • call hierarchy. 이런 것도 Vim 에서도 찾아 보면찾아보면있을 듯 한데듯한데..
특히 copy & paste, replace 등의 실수로 엄청난 버그들을 숨겨 놓는 경우가 많은 나의 경우엔 Eclipse 리팩토링 기능의 지원은 Vim 의 초간편함을 상쇄하고도 남음이다. 결국 실제 코딩에 들어가서 얼마 안되서 Eclipse C++ plugin인 CDT update... Vim 에도 이런 고급 기능이 지원되는 plugin 어디 없나? 있을 듯도 한데... 쩝.


쓰고나서 맞춤법 검사기를 돌려 봤더니 허걱... NARAINFOTECH 맞춤법 검사기 짱! 우리말 맞춤법 검사 인터넷에서 이렇게 잘 되는 거 처음 봤다. 기념으로 지저분하지만 틀린 맞춤법 표시하는 이 센스 ㅋ

Creative Commons License

트랙백 보낼 주소 :: http://devnuri.com/trackback/3

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

  1. 2008/01/04 15:02
    댓글 주소 수정/삭제 댓글
    ㅋㅋㅋ 맞춤법 검사 정말 놀랍지.
    참고로 Eclipse용 Vim Editor plug-in이 있었던 걸로 기억하는데, 약간 돈을 지불해야 했던 것같다. vim을 완벽하게는 지원하지 못해도 화살표키나 마우스 휠로 손이 안가는 것만으로도 상당히 편했던 기억이 있다.

    그리고, vim에선 ctrl-n을 누르면 완벽하진 않지만 나름 auto-complete의 기능을 맛볼 수 있다. 난 typing error를 줄이기 위해 꽤 긴 변수 명이나 클래스 명등은 습관적으로ctrl-n을 누른다.

function pointer tutorial의 첫 단락을 보고 간단한 예제를 만들어 보았습니다.

클래스 A는 fpShout라는 function pointer를 member variable로 가지고 있습니다.

class A{
private:
void (*fpShout)();
public:
A() { fpShout = NULL; };
void setShout(void (*fpFunc)()) { fpShout = fpFunc; };
void Shout()
{
if (fpShout == NULL)
cout << “fpShout is NULL” << endl;
else
fpShout();
};
};

전역으로 ShoutA()와 ShoutB()라는 함수를 선언하고 정의합니다.

void ShoutA() { cout << “A” << endl; };
void ShoutB() { cout << “B” << endl; };

클래스 B는 member variable로 클래스 A를 가지고 있으며  Shout()를 호출하면 자신의 메소드인 ShoutC()를 A에게 세팅하여 A의 Shout()를 호출합니다.

class B
{
private:
static void ShoutC() { cout << “C” << endl; };
A a;
public:
void Shout()
{
a.setShout(&ShoutC);
a.Shout();
};
};

main함수에서는 먼저 fpShout에 아무 것도 할당하지 않은 상태로 A의 인스턴스의 Shout()를 호출하고, 그 후 전역 함수인 ShoutA()와 ShoutB()를 각각 할당한 후 A의 Shout()를 호출합니다. 마지막으로 B의 인스턴스에 대해 Shout()를 호출합니다.

int main()
{
A a;
a.Shout();
a.setShout(&ShoutA);
a.Shout();
a.setShout(&ShoutB);
a.Shout();
B b;
b.Shout();
}

function pointer를 member variable로 가질 경우 먼저 NULL로 설정한 후 항상 NULL 체크를 한 후에 실행될 수 있도록 해야 합니다.

위 code를 컴파일해서 실행해 보면 아래와 같은 결과가 나옵니다.

fpShout is NULL
A
B
C

Creative Commons License

트랙백 보낼 주소 :: http://devnuri.com/trackback/2

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절

C++ Quiz

2007/12/12 14:44
간단한 퀴즈입니다.
cout << "Hello World!" << endl;

C++ 책 1장부터 우리가 사용하는 cout의 정체는 뭘까요?
1) class
2) object
3) function
4) template
5) keyword
6) none of the above
Creative Commons License
태그 C++

트랙백 보낼 주소 :: http://devnuri.com/trackback/1

댓글을 달아주세요:: 네티켓은 기본, 스팸은 사절