我一直在关闭几天的问题,列出超出Windows MAX_PATH
限制的文件名。 我正在使用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();
上述循环运行在与6755名的条目具有256个字符的平均字符串长度的向量。
通过wcout打印的代码大约需要52秒才能使用上面的循环显示矢量。使用wprintf的代码在大约1.2秒内打印。
如果我最小化控制台窗口,printf代码在大约500毫秒内运行,而wcout代码仍然需要大约40秒。
多年来我一直非常喜欢iostreams,但是......我一直在追求速度问题。在1993/1994使用Borland OS/2编译器时,我们遇到了一个类似的问题,运行时需要4到6个小时才能完成,使用sprintf运行大约200毫秒的strstream。
任何建议让我改变我的想法关于iostreams?
编辑:
所有这些关于潮红的话题都让我好奇。
是不是
\n
在一个
printf
字符串在功能上与
std::endl
相同的意思是,这两个字符串都会导致一个换行符和flush发送到输出?
IIRC,
printf
没有
\n
不会在某些操作系统上打印,直到填充缓冲区或刷新流(包括Windows在内)为止。
因此,如果
wprintf("%6.6d: %s\n", length, string)
被
\n
刷新,为什么不是
wprintf
像
wcout
那么慢呢?
感谢您的意见和建议。我希望在18年前当我开始盗用这些东西时,我已经拥有了它。
这可能是实际的控制台很慢,不是你的计划。如果将输出重定向到`yourprogram> file.txt`文件,或者写入实际文件而不是wcout,你会得到任何加速吗? – nos 2011-01-31 11:57:41
如果使用`\ n`而不是`endl`,性能会怎样? – 2011-01-31 11:59:41
@nos:这比较快速。重定向时只需要2秒就可以了。我可能要工作到一个批处理文件,这使将使用它不会有电脑盲诉诸命令行重定向:)谢谢 – JimR 2011-01-31 12:12:14