![]() by roadster 카테고리
전체잡설 개발 - STL 개발 - 일반 개발 - 디자인 미분류 이전블로그
more...이글루링크
미친병아리가 삐약삐약~★~ 우하하!!~ 프로.. 최근 등록된 덧글
setlocale(LC_ALL, ..by 최익필 at 09/28 setlocale(LC_ALL, .. by 짐퀴 at 07/07 전 오히려 느린것 보단 .. by 김양희 at 07/21 위에서 cout.imbue(l.. by 상한레몬 at 03/03 문제는 std::cout.imb.. by 냐모 at 10/31 삽질할 뻔 했던 시간 절약.. by 이규원 at 07/10 어익후 감사합니다. 전 .. by 한손에자유 at 06/02 감사합니다.^^ 저두 .. by shady at 01/27 도움이 되셨다니 다행입.. by roadster at 12/27 저두 삽질 하고 말았네요 .. by 삽질맨 .. at 12/05 |
Effective STL 을 보면 아주 멋진 코드가 나온다.
#include #include using namespace std; ifstream inputFile("some.txt"); string fileData((istreambuf_iterator 이 두 줄로 some.txt 파일을 fileData 로 옮길 수 있다는 것. 하지만 VC++ 6.0 에서는 컴파일이 안된다. 그 이유가 string 이 iterator 를 char* 로만 받아들이기 때문이다. 어떻게 해보려구 XSTRING 헤더를 고쳐보았지만 VC++ 의 string 은 msvcp60.dll 에 의존하기 때문에 XSTRING 헤더 백날 고쳐야 링크 에러만 난다. 빌어먹을 M$ 같으니라구... 그래서 어떻게든 해보려고 이런 코드를 짜보았다. void read1(LPCTSTR lpszFileName, string& str) { ifstream inputFile(lpszFileName); istreambuf_iterator istreambuf_iterator str.reserve(distance(begin, end)); inputFile.seekg(inputFile.beg); // distance를 계산하면서 stream이 끝에 가있기 때문에 첨으로 보내야된다. string::iterator sbegin(str.begin()); while(begin != end) { *sbegin++ = *begin++; } inputFile.close(); } 성공이다. 파일이 읽힌다. 그래서 속도가 얼마나 나오나 해서 흔히 쓰는 방식과 비교해보았다. void read2(LPCTSTR lpszFileName, string& str) { CStdioFile file; if(FALSE == file.Open(lpszFileName, CFile::modeRead|CFile::typeText)) return ; DWORD dwLength = file.GetLength(); str.reserve(dwLength); file.ReadHuge(&str[0], dwLength); file.Close(); } 속도가 어떻게 나올까? { const char* const filename = "D:\testestestest.log"; string str1; DWORD dwTick = GetTickCount(); read1(filename, str1); TRACE("%d ", GetTickCount() - dwTick); string str2; dwTick = GetTickCount(); read2(filename, str2); TRACE("%d ", GetTickCount() - dwTick); } STL만을 사용한 read1의 경우 약 900 ms 이상 MFC랑 같이 사용한 read2의 경우 약 15 ms 참고로 파일 크기는 약 500K 너무 어이 없어서 str.reserve(distance(begin, end)); <= 이부분을 str.reserve(540000); (실제 파일 사이즈) 로 하드코딩하고 테스트 했더니 1의 경우 약 450초로 단축되긴 했지만 약 30배의 시간이 든다. 좌절이다. 단지 희망이 있다면 istreambuf_iterator 가 전혀 최적화되어있지 않다고 한다. 내가 본 Effective STL 이 2002년도 책이니 개선되었을지도 모르겠지만 빌어먹을 M$ STL 은 이모양이다. 뭐 코드는 깔끔하고 이쁘지만 STL을 쓰는 것은 반드시 성능을 검증해보고 써봐야 할 것 같다. 특히 API를 대치하는 경우에는...
| ||||