2011-01-31 4 views
3

나는 Windows MAX_PATH 제한을 초과하는 파일 이름을 나열하는 며칠 동안 문제를 on/off 해왔다. 찾을 수있는 모든 패치가있는 Visual Studio 2008을 사용하고 있습니다. 타이밍은 QueryPerformanceCounter 및 회사에서 수행됩니다.iostreams가 느립니다. 속도를 높이는 방법이 있습니까?

최신 문제는 다음과 같은 코드에서 발생

start = getTime(); 
    for(vector<wstring>::iterator it = files.begin(); it != files.end(); ++it) 
    { 
#if USE_COUT 
      wcout << setw(6) << it->length() << L": " << *it << endl; // 1 
#else 
      wstring x(*it); 
      wprintf(L"%6.6d: %s\n", it->length(), x.c_str());   // 2 
#endif 
    } 
    stop = getTime(); 

위의 루프는 256 자 평균 문자열 길이가 6755 개 항목이 벡터를 통해 실행됩니다.

wcout을 통해 인쇄하는 코드는 위의 루프를 사용하여 벡터를 표시하는 데 약 52 초가 걸립니다. wprintf를 사용하는 코드는 약 1.2 초 후에 인쇄됩니다.

콘솔 창을 최소화하면 printf 코드는 약 500 밀리 초로 실행되는 반면 wcout 코드는 약 40 초 걸립니다.

나는 정말로 오랫동안 iostreams를 좋아했지만, ... 나는이 속도 문제에 대한 내 머리를 계속 고수했다. Borland OS/2 컴파일러를 사용하는 1993/1994에서는 sprintf로 약 200 밀리 초에 실행되는 strstream을 사용하여 완료하는 데 4-6 시간이 걸린 비슷한 런타임 문제가있었습니다.

iostreams에 대한 내 생각을 바꾸라고 제안 하시겠습니까?


편집 :
이 모든 플러싱에 대해 궁금한 점이 있습니다.
printf 문자열의 \nstd::endl과 기능적으로 같으므로 둘 다 줄 바꿈 및 플러시가 출력으로 방출됩니다.
없이 IIRC, printf은 버퍼가 채워 지거나 스트림이 플러시 될 때까지 (과거 Windows를 포함하여) 일부 OS에서는 인쇄되지 않습니다.
\n으로 플러시 된 경우 wprintfwcout으로 느린 이유는 무엇입니까?

귀하의 의견/제안에 감사드립니다. 나는 18 년 전에 내가이 물건을 해킹하기 시작했을 때 내가 그랬다면 좋겠다. endl 그냥 줄 바꿈보다 더으로 속도를

+1

실제 프로그램이 아닌 느린 콘솔 일 수 있습니다. 출력을'yourprogram> file.txt' 파일로 리디렉션하거나 wcout 대신 실제 파일에 쓰면 속도가 빨라 집니까? – nos

+1

'endl' 대신'\ n'을 사용하면 성능이 어떻게됩니까? –

+0

@nos : 그 일은 상당히 빨라졌습니다. 리다이렉션되었을 때 2 초가 걸린다. 이 일을 배치 파일로 처리해야 할 수도 있습니다. 컴퓨터가 문법 리디렉션을 사용하지 않아도 될 것입니다 :) 감사합니다. – JimR

답변

8

줄 바꿈 부호 std::endl은 줄 바꿈을 넣은 후 스트림을 플러시하기 때문에 성능 병목 현상을 일으킬 가능성이 큽니다. 모든 출력 끝에 '\n'std::wcout << std::flush으로 교환하십시오.

start = getTime(); 
for(vector<wstring>::iterator it = files.begin(); it != files.end(); ++it) 
{ 
     wcout << setw(6) << it->length() << L": " << *it << '\n'; // 1 
} 
std::wcout << std::flush; 
stop = getTime(); 
+0

감사합니다. – JimR

2
wcout << setw(6) << it->length() << L": " << *it << endl; // 1 

한 가지 방법은, 루프에서 "\n" 대신 endl을 사용하는 것입니다!

+0

이것은 Nawaz에게 감사 할 일입니다. – JimR

1

최적화 코드는 인간의 감각을 많이하지 않는 텍스트 행을 스크롤의 흐림 따라갈 수는덜 확인합니다. 이 접근 방식을 다시 생각해보십시오. 텍스트 파일로 출력하고 HTML을 사용하여보기 좋게 만든 다음 프로그램을 시작하여 결과를 표시합니다. 사용자의 눈이 더 쉬워졌습니다. lot도 빠르며 자동 플러싱이없고 콘솔을 스크롤하는 시간도 없습니다. 이제는 디스크 I/O 만 병목 현상입니다.

+0

프로그램은 사용자가 주로보고 싶어하는 마지막 요약 정보를 제공합니다. 파일 이름이 있으므로 필요할 경우 다시 참조 할 수 있습니다. 콘솔의 스크롤 백 크기는 max (9999 lines)로 설정되어 있으며, 원하는 내용입니다. 그래서 그 사람이 얻는 것입니다. – JimR

1

스트림을 반복 할 때마다 스트림을 플러시하지 않으면 속도가 빨라질 수 있습니다 (endl이 아니라 '\ n'을 사용하십시오). 내 생각에 printf가 더 빠를 것입니다.

루프 외부에서도 setw를 이동할 수 있습니다.

+1

루프 외부에서'setw '를 움직이면 첫 번째 반복에만 적용된다는 것을 의미합니다. –

관련 문제