交替使用cin/cout很慢

Alternating cin/cout is slow?

本文关键字:cout 很慢 cin      更新时间:2023-10-16

首先,我正在做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 秒。这背后的原因是什么?

请参阅std::basic_ios::tie,特别是以下部分:

绑定流是与流缓冲区(rdbuf())控制的序列同步的输出流,也就是说,在*this上的任何输入/输出操作之前,在绑定流上调用flush()

默认情况下,标准流cincerrclog都绑定到cout。同样,它们的宽对应物wcinwcerrwclog也与wcout联系在一起。

关键是要确保,在执行cout << "Enter something: "; cin >> something;等操作的典型交互式程序中,在程序等待输入之前,提示实际上出现在屏幕上。

但在您的情况下,这些额外的flush()调用会破坏流可能执行的任何缓冲,从而损害性能。

你可以用cin.tie(nullptr);打破领带