首先,我正在做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秒.这背后的原因是什么?
请参阅std::basic_ios::tie,特别是这些部分:
绑定流是与流缓冲区 ( ) 控制的序列同步的输出流
rdbuf(),即flush()在 上的任何输入/输出操作之前在绑定流上调用*this。默认情况下,标准流
cin、cerr和clog绑定到cout. 同样,它们的广泛对应物wcin和wcerr都wclog与 联系在一起wcout。
关键是要确保在典型的交互式程序中执行诸如 之类的操作时cout << "Enter something: "; cin >> something;,在程序等待输入之前提示实际上会出现在屏幕上。
但就您而言,这些额外的flush()调用会破坏流可能进行的任何缓冲,从而损害性能。
你可以打破平局cin.tie(nullptr);
| 归档时间: |
|
| 查看次数: |
167 次 |
| 最近记录: |