【问题标题】:Speeding printf and cout in windows在 Windows 中加速 printf 和 cout
【发布时间】:2018-06-11 10:08:32
【问题描述】:

Windows cout 和 printf 真的很慢,所以当发送大量数据时,它会降低应用程序的速度(它会发生在代码运行几天以检查是否一切正常时)。 加快速度的一种方法是在 main() 函数的开头编写以下代码来使用缓冲区:

#ifndef __linux__   //Introduce this code at the beginning of main() to increase a lot the speed of cout in windows: 
char buffer_setvbuf[1024];setvbuf(stdout, buffer_setvbuf, _IOFBF, sizeof buffer_setvbuf); //¿¡¡Sometimes it does not print cout inside a function until cout is used in main() or end of buffer is reached.
#endif

但不幸的是,有时它不会打印数据,因为缓冲区未满。

然后是问题: 1.如何强制打印:通过制作\n? 2. 如何禁用缓冲区?

【问题讨论】:

  • 我不明白问题的第 2 部分。您是否尝试设置缓冲区?
  • 如果你需要在缓冲区未满的情况下打印数据,我相信std::flush是你所需要的。
  • MSalters:设置缓冲区后,可以禁用吗? Croolman:谢谢,我赞成你的回答

标签: c++


【解决方案1】:

printf

我看到您正在尝试使用更大的内存缓冲区来减少对stdout 的写入次数。实际上,在缓冲区变满之前,您的代码不会打印任何内容,因为缓冲模式设置为 _IOFBF(即完全缓冲)。由于您想控制何时刷新,有两种方法可以解决。

  1. 使用_IOLBF(即行缓冲),并在您想要刷新时放置换行符。
  2. 调用fflush(stdout) 手动刷新缓冲区。

std::cout

我认为 std::cout 在编写 c++ 代码时应该首选,因为它易于使用。可能会减慢 I/O 进程的一件事是 iostreamstdio 之间的同步。据我所知,许多系统的默认设置是使两者保持同步,这有一些开销。您可以通过调用std::ios_base::sync_with_stdio(false) 禁用它。 reference

当您需要刷新输出时,您可以对输出流使用所谓的“操纵器”——即std::flushstd::endl。当这些操纵器被放入如下输出流时:std::cout << "your string" << std::endl,保证输出流被刷新。

std::endlreference

std::flushreference

底线

  1. 使用printf 进行输出时,使用fflush 刷新stdout
  2. 我建议在关闭同步的情况下尝试 std::cout,并测试它是否符合您的性能需求。

【讨论】:

  • '\n' 是否强制 printf 刷新缓冲区?我认为最好在句末使用 \n 而不是在开头使用
  • @mathengineer 如果您希望 printf 的缓冲区在换行符上刷新,应使用 _IOLBF 而不是 _IOFBF。或者您可以使用fflush 手动刷新stdout。但是,我建议在 c++ 中坚持使用 std::cout,除非您有充分的理由不使用它。
猜你喜欢
  • 2011-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 2020-08-12
  • 1970-01-01
  • 2013-03-24
相关资源
最近更新 更多