개발하면서 느꼈던 점
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
rss

skin by roadster
istreambuf_iterator를 이용한 ifstream -> string
Effective STL 을 보면 아주 멋진 코드가 나온다.

#include
#include
using namespace std;

ifstream inputFile("some.txt");
string fileData((istreambuf_iterator(inputFile)), istreambuf_itreator());


이 두 줄로 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 begin(inputFile);
    istreambuf_iterator end;

    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를 대치하는 경우에는...
by roadster | 2005/06/25 16:01 | 개발 - STL | 트랙백(1) | 덧글(2)
트랙백 주소 : http://roadster.egloos.com/tb/273828
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
Tracked from 최익필의 이름없는 블로그 at 2008/07/27 21:14

제목 : 항목 29 : 문자 단위의 입력에는 istreamb..
내가 STL에 조예가 깊어서 글을 남기는 것이 아니라, Effecitve STL 을 공부하는 사람들이 이 글을 보고, 도움이 되었으면 하는 생각과, 혹시 내가 틀린것이 있다면 지적해 주시지 않을까 란 생각으로 글을 올리는것임을 미리 밝힙니다. - 최익필 Stream Library 관계도 이번 주제는 istream_iterator의 사용보다 istreambuf_iterator의 사용이 더 좋을 수가 있다. 는 것이다. 이유는 istream_ite......more

Commented by alones at 2007/04/27 20:18
좋은 글 감사합니다. ^^
Commented by shady at 2008/01/27 23:33
감사합니다.^^
저두 그책보고..했는데..컴파일이 안되어서..왜 안되는지 궁금했는데..

근데.. 만드신 함수가 이해가 안되네요 ㅠ
제가 학생이라서..내공이 영 딸리나봐요

:         :

:

비공개 덧글

◀ 이전 페이지 다음 페이지 ▶