首先,我正在做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秒钟。这背后的原因是什么?
答案 0 :(得分:3)
请参阅std::basic_ios::tie
,特别是这些部分:
绑定流是一个输出流,它与流缓冲区(
rdbuf()
)控制的序列同步,也就是说,在任何输入/输出操作之前,在绑定流上调用flush()
*this
。默认情况下,标准流
cin
,cerr
和clog
与cout
绑定。同样,广泛的同行wcin
,wcerr
和wclog
与wcout
相关联。
重点是确保在典型的交互式程序中执行cout << "Enter something: "; cin >> something;
之类的操作,在程序等待输入之前,屏幕上会出现提示。
但是在你的情况下,那些额外的flush()
次呼叫会破坏流可能做的任何缓冲,从而损害性能。
你可以用cin.tie(nullptr);