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
因为两者都会导致换行和刷新发送到输出?printf
没有\n
在某些操作系统上打印,直到填充缓冲区或刷新流,包括过去的Windows.wprintf( "%6.6d: %s\n", length, string )
被冲了\n
,为什么不wprintf
慢wcout
呢?
感谢您的反馈/意见.我希望18年前我开始黑客攻击这些东西了.
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)
归档时间: |
|
查看次数: |
1262 次 |
最近记录: |