【发布时间】:2011-06-18 13:03:58
【问题描述】:
我几天来一直在破解一个问题,该问题列出了超过 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();
上面的循环运行在一个包含 6755 个条目的向量上,平均字符串长度为 256 个字符。
通过 wcout 打印的代码使用上面的循环显示矢量大约需要 52 秒。使用 wprintf 的代码在大约 1.2 秒内打印出来。
如果我最小化控制台窗口,printf 代码运行大约需要 500 毫秒,而 wcout 代码仍然需要大约 40 秒。
这些年来我真的很想喜欢 iostreams,但是……我一直在思考这个速度问题。在 1993/1994 年,当使用 Borland OS/2 编译器时,我们遇到了类似的问题,即使用 strstream 需要 4 到 6 个小时才能完成运行,而使用 sprintf 运行大约需要 200 毫秒。
有什么建议可以让我改变对 iostreams 的看法?
编辑:
所有这些关于潮红的话题都让我很好奇。
\n 在printf 字符串中的功能是否与std::endl 相同,因为两者都会导致换行符和刷新被发送到输出?IIRC,没有
\n 的 printf 不会在某些操作系统上打印,直到缓冲区被填充或流被刷新,包括过去的 Windows。那么,如果
wprintf( "%6.6d: %s\n", length, string ) 被\n 刷新,为什么wprintf 不如wcout 慢?
感谢您的反馈/意见。我希望我在 18 年前开始研究这些东西时就拥有了 SO。
【问题讨论】:
-
速度慢的可能是实际的控制台,而不是您的程序。如果您将输出重定向到文件
yourprogram >file.txt或写入实际文件而不是 wcout ,您会得到任何加速吗? -
如果使用
\n而不是endl,性能会怎样? -
@nos:这大大加快了速度。重定向时缩短到 2 秒。我可能必须将它处理成一个批处理文件,以便使用它的计算机文盲不必求助于命令行重定向:) 谢谢
-
@Charles Bailey:只要隐藏控制台窗口,就可以显着减少时间。如果控制台窗口没有隐藏,它会快 800 毫秒到 1 秒,这看起来很奇怪。谢谢。
-
@JimR:您能否明确说明您的时间安排。多少是显着的?你的意思是如果控制台没有隐藏,使用'\n'需要40s +(0.8s ~ 1s)?
标签: c++ windows visual-c++ iostream