2011-01-31 20 views
3

我一直在关闭几天的问题,列出超出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刷新,为什么不是 wprintfwcout那么慢呢?

感谢您的意见和建议。我希望在18年前当我开始盗用这些东西时,我已经拥有了它。

+1

这可能是实际的控制台很慢,不是你的计划。如果将输出重定向到`yourprogram> file.txt`文件,或者写入实际文件而不是wcout,你会得到任何加速吗? – nos 2011-01-31 11:57:41

+1

如果使用`\ n`而不是`endl`,性能会怎样? – 2011-01-31 11:59:41

+0

@nos:这比较快速。重定向时只需要2秒就可以了。我可能要工作到一个批处理文件,这使将使用它不会有电脑盲诉诸命令行重定向:)谢谢 – JimR 2011-01-31 12:12:14

回答

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(); 
2
wcout << setw(6) << it->length() << L": " << *it << endl; // 1 

一个加快的方法是使用"\n"代替endl在循环,如endl不仅仅是一个换行符更多!

1

优化代码,使其可能是人能跟上滚动文本行不会使一个很大的意义的模糊。重新思考这种方法。输出到一个文本文件,使用HTML也许看起来不错,然后启动一个程序来显示结果。用户的眼睛更轻松。它会更快地运行lot,无需自动刷新,也无需花时间滚动控制台。现在只有磁盘I/O是你的瓶颈。

1

由于不是每次迭代都会刷新流(使用'\ n'而不是endl),这很可能会加快你的速度,尽管我的猜测是你仍然会发现printf更快。

您可能会移动运输及工务局局长的循环之外也顺便说一下。

相关问题