C++中的cin和cout为啥有时候慢得让人抓狂?

C++中的cin和cout为啥有时候慢得让人抓狂?

大家在C++编程的过程中,cincout 肯定最常用的了,使用它们的优点很多,其中就有语法简洁、类型安全这两个主要的优势。但是在用它们处理大量数据的时候,比如算法竞赛或者是日志处理,那么表现就会不尽如人意,常常就会出现程序运行逻辑简单,但是运行就是超时。

一、性能瓶颈的根源

1. 与C标准库的同步(sync_with_stdio)

C++肯定是要兼容之前的C语言,所以它默认把 cin/coutstdin/stdout 同步。这样就会让你每次使用 cincout 的时候,系统为了确保C和C++的缓冲区时一样的,那么就会出现额外的开销。

2. cin 与 cout 的绑定(tie)

在你没修改过的情况下,cintiecout

也就是你每次执行 cin >> x; 之前,程序肯定刷新 cout 的缓冲区(相当于调用 cout.flush())。导致在频繁的交互式输入输出的时候,会形成大量的,不必要的I/O操作。

3. 滥用 endl

endl 会不仅仅输出换行符 \n,也会强制去刷新输出的缓冲区。在程序循环中会使用 endl ,这样就显著拖慢了程序的效率,让你很明显能感觉到慢!

二、优化方案:两行代码提速10倍+

知道原理之后,那么解决起来也是很简单,只需要在 main 函数开头加入以下两行,就能解除这个强制逻辑运行,让cin/cout 接近 scanf/printf 的速度:

#include <iostream>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    // 你的高速IO代码
    int n;
    cin >> n;
    cout << "读取到: " << n << '\n';  // 注意:用 '\n' 代替 endl

    return 0;
}

三、对比实验:优化前后性能差异

接下来我做了一个较为简单的性能测试示例,希望对大家有所帮助:

// 未优化版本(可能超时)
#include <iostream>
using namespace std;

int main() {
    int x;
    for (int i = 0; i < 1000000; ++i) {
        cin >> x;
        cout << x << endl;  // 危险:频繁刷新
    }
    return 0;
}
// 优化后版本(高效稳定)
#include <iostream>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int x;
    for (int i = 0; i < 1000000; ++i) {
        cin >> x;
        cout << x << '\n';  // 安全:仅换行,不刷新
    }
    return 0;
}

四、注意事项

  • 你如果已经开始去调用 ios::sync_with_stdio(false);,那么别用 scanf/printfcin/cout,不然很有可能出现输入输出结果混乱。
  • cin.tie(nullptr); 解除了 cincout 的依赖,适合纯输入或者批量处理的应用场景。如果你开发的程序要求需要“先提示再输入”(如 cout << "请输入:"; cin >> x;),保留绑定或手动 cout.flush()
  • 不能说是全部场景,但是在大部分的OJ和大数据场景之中,我所说的解决方法都是标准解决方案。

很多时候,程序出现问题还是经验不足,你只要学会了我所写的,那么就可以享受 C++ 语法便利,也能让C++和C语言的 I/O 性能相差不多。

Annie整理的云服务器优惠列表

云服务商 它的优点 客官来看
阿里云 轻量云服务器38元/年(需抢)、68元/年(限购一台)、ECS云服务器99元/年(续费同价) 点击进入
腾讯云 2核2G4M 服务器新客99元/年 353元/3年 进来逛逛
UCloud 2核2G3M 轻量云主机83元/年 华盛顿/洛杉矶/圣保罗/法兰克福/伦敦90元/年 快来看看
雨云 签到1个月送一周,签到2个月0.5个月,以此类推,新人五折首购优惠 超时空跃迁
HostVDS 1核1G 云服务器0.99美元/月 实时计费 随意换ip 随时可以注销云服务器 进入,内地打开慢
LightNode 全球有45+节点,许多冷门地区,实时计费,随意换ip,随时取消 点击进入

注:以上为佣金推广链接,我们可能从中获得收益,但不会影响您的购买价格。