繁体   English   中英

交替的cin / cout很慢?

[英]Alternating cin/cout is slow?

首先,我正在做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()

默认情况下,标准流cincerrclogcout绑定。 同样,他们广泛的同行wcinwcerrwclogwclog联系wcout

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM