交替使用cin/cout会变得很慢吗?

5

首先,我使用std::ios_base::sync_with_stdio(false)。以下是从文本文件 (<input.txt >output.txt) 读取一百万个整数的代码:

int tests;
cin >> tests;
for (int i = 0; i < tests; ++i) {
  int number;
  cin >> number;
  cout << number << "\n";
}

并且

int tests;
cin >> tests;
vector<int> numbers(tests);
for (int i = 0; i < tests; ++i) {
  cin >> numbers[i];
}
for (int i = 0; i < tests; ++i) {
  cout << numbers[i] << "\n";
}

当然,在现实中,它们不仅仅是打印相同的数字。问题在于,第一个块需要的时间大约是第二个块的4倍(6.2秒对比1.8秒)。

使用printf/scanf重写相同的代码,在两种情况下都只需要3秒钟。这背后的原因是什么?


7
cincouttie()ed的。对其中一个进行操作会调用另一个的flush()方法。 - Igor Tandetnik
sync_with_stdio 不是为了防止这种情况吗? - riv
3
дёҚиЎҢпјҢйӮЈдјҡз ҙеқҸcoutе’Ңprintfд№Ӣй—ҙзҡ„иҒ”зі»гҖӮиҖҢдёҚжҳҜcoutе’Ңcinд№Ӣй—ҙзҡ„иҒ”зі»гҖӮ - Igor Tandetnik
1
哦,谢谢,添加 cin.tie(NULL) 确实有帮助。好的,这很好知道 >.> - riv
2
@riv sync_with_stdio 确保 std::coutstdout 的输出不会混合。tie() 确保任何对 std::cout 的输出都会在尝试从 std::cin 读取之前出现(粗略地说,在这种情况下)。换句话说,如果您正在交互式地输出提示,然后输入,您不需要显式刷新(如果输出是到 stdout,并且输入来自 stdin,则需要刷新)。 - James Kanze
1个回答

3
请参考std::basic_ios::tie, 特别注意以下内容:
- 绑定(tie)的流是一个输出流,与该流缓冲区(rdbuf())控制的序列同步,也就是说,在对*this进行任何输入/输出操作之前,会在绑定的流上调用flush(). - 默认情况下,标准输出流 coutcerrclog 都绑定到 cin。类似地,宽字符版本的流 wcoutwcerrwclog 都绑定到 wcin。 - 目的在于确保在典型的交互式程序中执行像cout << "Enter something: "; cin >> something;这样的操作时,提示信息实际上出现在屏幕上,然后程序等待输入。 - 但在某些情况下,这些额外的flush()调用会破坏流所做的所有缓冲,从而降低性能。 - 您可以使用cin.tie(nullptr);来解除绑定。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接