기본 콘텐츠로 건너뛰기

주변인 분류

내 주변인은 딱 두 종류인 듯. 일반인 과 덕후 . 참고로 일반인은 자신이 일반인이란 자각 자체가 없으나, 덕후들은 자기가 일반인이라고 우김. 원본 위치: http://purewell.egloos.com/3411286

부하가 걸리는 함수 찾기 - callgrind

valgrind에 여러 도구 가운데 callgrind 라는 녀석이 있다. 함수 호출 회수와 걸린 시간 등을 긁어주는 프로파일러이다. 사용법은 무지 간단하다. $ valgrind --tool=callgrind [프로그램] [프로그램 인자] 이렇게 하면 callgrind.out.[PID]로 중간 파일이 뛰쳐 나온다. 이걸 callgrind_annotate 같은 텍스트 툴로 보면 대략 눈 많이 아프더라. KDE용 프로그램 가운데 KCachegrind 라는 녀석이 있다. valgrind-callgrind 같은 패키지 깔면 같이 깔리는 기특한 녀석이다. KCachegrind를 실행하고 위에서 나온 callgrind.out 파일을 열면 함수별 부하가 눈에 보기 편하게 나온다. (내부적으로 dot을 이용하는 모양) 덧글: 프로그램은 -pg 옵션은 필요하지 않으며, -g 옵션은 해줘야 쓸만한 정보가 뛰쳐나온다. 원본 위치: http://purewell.egloos.com/3410603

애완동물은 안고 통과하자!

한가위에 부산에 가야하는데 KTX보다 돈 쪼꼼만 더 주면 더 빠르고 더 편안하게 갈 수 있는 비행기 를 이용하기로 했다. 탑승 수속을 밟으면서 X-ray로 짐을 검사하는 곳에 로빈을 담아둔 가방을 통과시키려고 하자 검사하는 분이 뭐냐고 묻는다. 고양이라고 했더니, 짐을 검사하는 X-ray로 통과하면 안 된다고 한다. 이때 소심한 샘이와 잼이는 고양이 데리고 비행기 타면 안 된다는 소리로 들었다. 분명히 5Kg 이내 애완동물은 들고 타도 괜찮다고 들었는데 말이야... 잠시 멀뚱거리는 동안 검사하는 분이 고양이를 안고 금속 탐지기를 지나가라고 했다. 생명체는 짐을 검사하는 X-ray를 통과하면 안 된다는군. 무사히 수속을 마치고 부산까지 별 탈 없이 잘 날아갔다. 원본 위치: http://purewell.egloos.com/3407971

map::find(const string&) const 피하는 방법 없을까?

STL에 map과 string을 엮어서 자주 사용하는 편인데, 일반적인 규모에서는 흡족할만한 성능을 보여주기에 별 불만이 없다. 하지만 대용량처리(초당 1,000,000건 정도?)를 하다보면 실망스럽기 서울역에 그지 없다. 다음 소스를 보면 암묵적 형변환 에 의해 얼마나 그지 같이 느려지는지 알 수 있다. testFunc(size_t cnt) { map<string,void*> tmpcont; const char* key_1("Hello, world! What are you doing?"); const string key_2(key_1); // 100만개 아이템을 우겨넣는다. (생략) // C-style string key t1 = getTimestamp(); for (size_t i(0); i<cnt; i++) { tmpcont.find(key_1); } t2 = getTimestamp(); cerr << t2-t1 << endl; // STL string key t1 = getTimestamp(); for (size_t i(0); i<cnt; i++) { tmpcont.find(key_2); } t2 = getTimestamp(); cerr << t2-t1 << endl; } 결과는 약 5배 차이가 난다. -_-; 5배 차이라고 해봤자, 1,000,000건에 0.1초 차이이지만, 대용량 처리에서 저런게 누적하기 시작하면 대략 난감하다. map에서 반드시 key_type과 동일한 타입을 인자로 갖는 비교 함수를 쓰지 않는다면 어떻게 해보겠지만, 정말이지 초난감할 뿐이다. 어떻게 하지...? 원본 위치: http://purewell.egloos.com/3400058

임시변수와 스택

C/C++을 하다보면 자기도 모르는 사이에 임시변수를 쓰곤하는데, 대부분 암묵적 형변환에 의해서이다. 이때 발생하는 임시변수는 어디에 만들어지는 것일까? 보통 함수 내 자동 변수들은 프로세스 스택에 만들어지는 것으로 알고 있다. 정말 그런지 알아봐야겠다. #include <iostream> #include <string> using namespace std; volatile bool gTest(true); const char gString[] = "Hello, world!"; template<typename _T> void _func(const _T& v) { cerr << "Temporary variable: " << (void*)&v << endl; cerr << "Temporary buffer: " << (void*)(v.c_str()) << endl; } template<typename _T> void callStack(void) { _T local1; cerr << "Type ID: " << typeid(local1).name() << endl; cerr << "Local1 variable: " << (void*)&local1 << endl; cerr << "Local1 buffer: " << (void*)(local1.c_str()) << endl; if ( gTest ) { _T local2; cerr << "Local2 variable: " << (void*)&local2 ...