【问题标题】:Are C++ << and >> operators slow? What alternatives are there to these operators?C++ << 和 >> 运算符慢吗?这些运算符有哪些替代方案?
【发布时间】:2015-03-18 20:49:40
【问题描述】:

我正在为大学做一个项目,我正在使用 C++。我将std::cinstd::cout&lt;&lt;&gt;&gt; 运算符一起使用来读取输入并显示输出。我的教授发布了一个公告,说&gt;&gt;&lt;&lt; 不推荐,因为它们很慢。

我们只需要读取整数并且输入总是正确的(我们不需要验证它,我们知道它的格式并且只需要读取它)。如果不推荐&lt;&lt;&gt;&gt;,那么我们应该使用哪些替代方案?

【问题讨论】:

  • 如果教授的信息在这里是准确和完整的,有过早优化的味道。
  • 也许他想让你使用像printfscanf和朋友这样的C风格的IO函数。
  • @0x499602D2:也许,但我不知道有什么理由认为它们比std::cout &lt;&lt; ...std::cin &gt;&gt; ... 快。注意printf 必须解析格式字符串。
  • 教授是否对操作员进行了分析以支持他的说法,即他们很慢?和慢相比究竟是什么? 他的选择是什么?
  • 关于效率问题之前有一些讨论:stackoverflow.com/questions/605839/c-and-c-file-i-o 作为个人说明,如果您正在学习入门编程课程,您没有理由担心这种效率。

标签: c++ operators


【解决方案1】:

对于 cout,您可以使用 putwrite

// single character
char character;
cout.put(character);

// c string
char * buffer = new char[size];
cout.write(buffer, size);

对于 cin,您可以使用 getreadgetline

// Single character
char ch;
std::cin.get(ch); 

// c string
char * buffer = new char[size];
std::cin.read(buffer, size);
std::cin.get(buffer, size);
std::cin.getline(buffer, size);

【讨论】:

  • 我不认为这些比&lt;&lt; 版本快得多,而且您没有提供处理整数的方法。
  • 效率的大部分损失是由于从文本表示到内部表示的翻译。
  • 感谢您的回答。我最终改用了 scanf 和 printf。
【解决方案2】:

当您有大量数据要处理(超过 1E06 个项目)时,需要担心 C++ 中的流提取运算符(>)的速度。对于较小的数据集,执行时间对于计算机和程序的其他因素可以忽略不计。

在担心格式化 I/O 的速度之前,请让您的程序正常运行。检查您的算法以提高效率。检查您对算法的实现以提高效率。查看数据以提高效率。

流提取运算符的缓慢之处在于首先从文本表示转换为内部表示,然后是实现。哎呀,如果您正在输入数据,请忘记任何优化。为了加快您的文件阅读速度,组织数据以便于提取和翻译。

如果您仍然对效率感到恐慌,请使用 二进制 文件表示。文件中的数据应该被格式化,以便它可以直接加载到内存中而无需任何翻译。此外,数据应该以大块的形式加载。

来自银河系漫游指南不要惊慌

【讨论】:

  • 我最终改用了 scanf 和 printf (这使它更快一点)。不过感谢二进制文件表示的想法,值得研究。
猜你喜欢
  • 2011-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
相关资源
最近更新 更多