交替的cin/cout很慢?

riv*_*riv 5 c++ iostream

首先,我正在做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";
}
Run Code Online (Sandbox Code Playgroud)

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";
}
Run Code Online (Sandbox Code Playgroud)

当然,实际上他们所做的不仅仅是打印相同的数字.问题是,第一个块大约需要4倍(6.2秒对1.8).

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

Igo*_*nik 3

请参阅std::basic_ios::tie,特别是这些部分:

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

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

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

但就您而言,这些额外的flush()调用会破坏流可能进行的任何缓冲,从而损害性能。

你可以打破平局cin.tie(nullptr);