iostreams很慢.有没有办法加快他们的速度?

Jim*_*imR 3 c++ windows iostream visual-c++

现在,我一直在打开和关闭一个问题几天,列出超过Windows MAX_PATH限制的文件名.我正在使用Visual Studio 2008以及我能找到的所有补丁.时间由QueryPerformanceCounter和公司完成.

最新问题出现在以下代码中:

    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();
Run Code Online (Sandbox Code Playgroud)

上面的循环遍历一个包含6755个条目的向量,平均字符串长度为256个字符.

通过wcout打印的代码大约需要52秒才能使用上面的循环显示向量.使用wprintf的代码在大约1.2秒内打印.

如果我最小化控制台窗口,则printf代码在大约500毫秒内运行,而wcout代码仍然需要大约40秒.

这些年来我真的很喜欢iostreams,但是......我一直在关注这个速度问题.在1993/1994年使用Borland OS/2编译器时,我们遇到了类似的问题,运行时使用sprintf在大约200毫秒内运行的strstream需要4到6个小时才能完成.

有什么建议让我改变我对iostreams的看法吗?


编辑:
所有关于潮红的谈话让我很好奇.
是不是\n在一个printf字符串中的功能相同,std::endl因为两者都会导致换行和刷新发送到输出?
IIRC,printf没有\n在某些操作系统上打印,直到填充缓冲区或刷新流,包括过去的Windows.
那么,如果wprintf( "%6.6d: %s\n", length, string )被冲了\n,为什么不wprintfwcout呢?

感谢您的反馈/意见.我希望18年前我开始黑客攻击这些东西了.

Rud*_*udi 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();
Run Code Online (Sandbox Code Playgroud)