나는 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
문자열의
\n
은
std::endl
과 기능적으로 같으므로 둘 다 줄 바꿈 및 플러시가 출력으로 방출됩니다.
없이 IIRC,
printf
은 버퍼가 채워 지거나 스트림이 플러시 될 때까지 (과거 Windows를 포함하여) 일부 OS에서는 인쇄되지 않습니다.
이
\n
으로 플러시 된 경우
wprintf
이
wcout
으로 느린 이유는 무엇입니까?
귀하의 의견/제안에 감사드립니다. 나는 18 년 전에 내가이 물건을 해킹하기 시작했을 때 내가 그랬다면 좋겠다. endl
그냥 줄 바꿈보다 더으로 속도를
실제 프로그램이 아닌 느린 콘솔 일 수 있습니다. 출력을'yourprogram> file.txt' 파일로 리디렉션하거나 wcout 대신 실제 파일에 쓰면 속도가 빨라 집니까? – nos
'endl' 대신'\ n'을 사용하면 성능이 어떻게됩니까? –
@nos : 그 일은 상당히 빨라졌습니다. 리다이렉션되었을 때 2 초가 걸린다. 이 일을 배치 파일로 처리해야 할 수도 있습니다. 컴퓨터가 문법 리디렉션을 사용하지 않아도 될 것입니다 :) 감사합니다. – JimR