Всем привет! Хочу показать вам реальный пример, в котором использование следующих плюшек ускорения ввода-вывода:
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
приводит к замедлению программы, написанной на C++, в два раза!
Пример довольно простой — мы будем выводить в двоичном представлении все целые числа из отрезка $$$[0,10^7)$$$:
#include <bits/stdc++.h>
using namespace std;
int main() {
//ios::sync_with_stdio(false);
//cin.tie(0); cout.tie(0);
char buf[33]={0};
buf[32] = '\n';
for (int i = 0; i < 10'000'000; i++) {
for (int bit = 30; bit >= 0; bit--) {
buf[30-bit] = ((i >> bit) & 1) ? '1' : '0';
}
cout << buf;
}
}
UPD. Когда я заменил buf[32] = '\n';
на buf[31] = '\n';
, чтобы последним символом был '\0'
, а предпоследним — '\n'
, ситуация кардинально не изменилась.
Если мы запустим этот пример в codeforces custom invocation, то мы увидим Used: 1840 ms, 1184 KB
. Когда мы раскоментируем закоментированные строки, ускоряющие ввод-вывод в C++, мы увидим Used: 3759 ms, 1188 KB
. Это ловушка!
UPD2. AsGreyWolf предложил использовать компилятор GNU G++20 11.2.0 (64 bit, winlibs)
вместо GNU G++17 9.2.0 (64 bit, msys 2)
и это решило проблему замедления. Для любого другого GNU компилятора, доступного на codeforces, проблема сохраняется.
а что насчет это штуки? как она влияет на программу? ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
простите пожалуйста за тупой комент, был уставший :)