Замедление вывода в два раза из-за ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); в C++

Правка ru3, от dmkz, 2021-11-07 13:37:34

Всем привет! Хочу показать вам реальный пример, в котором использование следующих плюшек ускорения ввода-вывода:

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, проблема сохраняется.

История

 
 
 
 
Правки
 
 
  Rev. Язык Кто Когда Δ Комментарий
ru3 Русский dmkz 2021-11-07 13:37:34 273
en3 Английский dmkz 2021-11-07 13:35:20 221
en2 Английский dmkz 2021-11-07 13:27:42 99
ru2 Русский dmkz 2021-11-07 13:26:14 173 Мелкая правка: 'м - `'\n'` ситуация ' -> 'м - `'\n'`, ситуация '
ru1 Русский dmkz 2021-11-07 13:14:48 1267 Первая редакция перевода на Русский
en1 Английский dmkz 2021-11-07 13:10:19 1186 Initial revision (published)