跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 实验:cout 与 printf 输出速度对比

C++ 中 cout 与 printf 的输出速度对比实验表明,在标准输出模式下 printf 略快于 cout。但在文件读写场景下,由于 cout 和 ofstream 拥有更大的缓冲区策略,其性能优于 printf。实验数据显示,在百万级数据量下,文件流输出耗时显著低于重定向 printf。结论建议常规 OJ 刷题使用关闭同步流的 cout,格式化输出时使用 printf,大规模文件 IO 优先选择 ofstream。注意避免频繁使用 endl 导致缓冲区刷新。

晚风告白发布于 2026/3/15更新于 2026/10/15102 浏览
C++ 实验:cout 与 printf 输出速度对比

实验起因

输出是信息学竞赛的基础,但高等级 OI 中输出量过大容易导致 TLE。因此,学习如何更快输出至关重要。

关于 OLE

洛谷有一种评测状态叫 OLE(Output Limit Exceeded),意为输出超限。

示例代码:

#include<bits/stdc++.h>
using namespace std;
int main(){
    while(1){
        printf("555555555555555\n");
    }
    return 0;
}

这段代码会在规定时间内输出大量内容,导致程序被 OJ 强行终止并判定 OLE。这引发了一个广泛说法:cout 效率比 printf 低。为了验证这一传言,我进行了一次实验。

实验设计

为保证公平比较,所有测试遵循以下条件:

  • 编译环境:使用 mingw64 的 g++ 编译,参数 -std=c++14 -O2。
  • 计时方法:使用 C++11 的 chrono 库进行毫秒级计时,单组实验多次取平均值。
  • 测试场景:涵盖标准输出、输出重定向到文件、直接使用文件流 (ofstream) 三种情况。
  • 测试数据:从少量(100 个)到大量(1000000 个)递增。

实验过程

标准输入输出

标准输入输出流版本:

#include<iostream>
#include<cstdio>
#include<chrono>
using namespace std;
int main(){
    auto program_start = std::chrono::high_resolution_clock::now();
    for(int i = 0; i < 100; i ++){
        cout << 1;
    }
    auto program_end = std::chrono::high_resolution_clock::now();
    auto total_duration = std::chrono::duration_cast<std::chrono::milliseconds>(program_end - program_start);
    cout << "time:" << total_duration.count() << "ms" << endl;
    return 0;
}

输出时间约为 15ms。将 cout << 1 换成 printf("1"),平均时间直接降至 10ms。此时 printf 较快。

文件读写

文件重定向 + printf 的速度:

#include<iostream>
#include<cstdio>
#include<chrono>
using namespace std;
int main(){
    auto program_start = std::chrono::high_resolution_clock::now();
    freopen("test.out","w",stdout);
    for(int i = 0; i < 100; i ++){
        printf("1");
    }
    auto program_end = std::chrono::high_resolution_clock::now();
    auto total_duration = std::chrono::duration_cast<std::chrono::milliseconds>(program_end - program_start);
    cout << "time:" << total_duration.count() << "ms" << std::endl;
    fclose(stdout);
    return 0;
}

输出:0ms。

文件流 (fout) 的表现:

#include<fstream>
#include<chrono>
using namespace std;
int main(){
    auto program_start = std::chrono::high_resolution_clock::now();
    ofstream fout("test.out");
    for(int i = 0; i < 100; i ++){
        fout << 1;
    }
    auto program_end = std::chrono::high_resolution_clock::now();
    auto total_duration = std::chrono::duration_cast<std::chrono::milliseconds>(program_end - program_start);
    fout << "time:" << total_duration.count() << "ms" << std::endl;
    fclose(stdout);
    return 0;
}

输出:0ms。

小规模文件操作和 std 相比速度相当。

加大数据量

输出 100000 个 1:

#include<fstream>
#include<chrono>
using namespace std;
int main(){
    auto program_start = std::chrono::high_resolution_clock::now();
    ofstream fout("test.out");
    for(int i = 0; i < 100000; i ++){
        fout << 1;
    }
    auto program_end = std::chrono::high_resolution_clock::now();
    auto total_duration = std::chrono::duration_cast<std::chrono::milliseconds>(program_end - program_start);
    fout << endl << "time:" << total_duration.count() << "ms" << endl;
    fclose(stdout);
    return 0;
}

输出:1ms。

#include<iostream>
#include<cstdio>
#include<chrono>
using namespace std;
int main(){
    auto program_start = std::chrono::high_resolution_clock::now();
    freopen("test.out","w",stdout);
    for(int i = 0; i < 100000; i ++){
        printf("1");
    }
    auto program_end = std::chrono::high_resolution_clock::now();
    auto total_duration = std::chrono::duration_cast<std::chrono::milliseconds>(program_end - program_start);
    cout << endl << "time:" << total_duration.count() << "ms" << std::endl;
    fclose(stdout);
    return 0;
}

输出:6ms。

为了真正显现出两者速度的差别,加大数据至 1000000 个 1:

输出 1 的数量文件读写形式使用语句时间(取平均值)
100 个*cout<<1;15ms
100 个*printf("1");10ms
100 个文件重定向printf("1");0ms
100 个文件重定向cout << 1;0ms
100 个文件流fout << 1;0ms
100000 个文件重定向printf("1")6ms
100000 个文件重定向fout << 1;2ms
100000 个文件流fout << 1;1ms
1000000 个文件重定向printf("1");56ms
1000000 个文件重定向fout << 1;26ms
1000000 个文件流fout << 1;16ms

这一次,即使是 printf 也花了 56 毫秒。测 cout,结果竟是 27 毫秒。测了 10 次,最慢就是 27 毫秒。因此这个数据正式破除了一个言论:cout 永远比 printf 慢。事实证明,它在文件读写更胜一筹。

这次使用的是文件重定向,而文件流 (fout) 的表现则更让人惊讶:仅仅 16 毫秒。

实验结论

数据分析

  • 在小数据量情况下,cout 确实慢于 printf,cout 由于需要维护类型安全并可能与 C 标准流同步,其单次函数调用的开销略高于 printf。
  • 在文件读写且中小数据量时,两者相差不多,因为重定向和文件流的缓冲区都够大,磁盘 IO 会在关闭文件时统一处理。
  • 在大规模文件读写时,cout 和 fout 更大缓冲区的好处就出来了:真实磁盘 IO 次数少很多。因此它们相对缓冲区小且更保守的 printf 快。
  • cout 的输出在文件 IO 时还得重定向,fout 根本不用,缓冲区策略也激进,磁盘 IO 更少,所以在所有文件测试中都领先。

建议

对于常规 OJ 刷题,推荐 cout(求速度使用 ios::sync_with_stdio(false);,会关闭与 C 标准流的同步);对于需格式化输出的时候,iomanip 内的工具开销较大,所以推荐 printf;正规比赛时,还得用 fout 等,重定向顺手但相对其较慢。

注意:使用 cout 时少用 std::endl,会自动清空缓冲区,多一次 IO。

目录

  1. 实验起因
  2. 关于 OLE
  3. 实验设计
  4. 实验过程
  5. 标准输入输出
  6. 文件读写
  7. 加大数据量
  8. 实验结论
  9. 数据分析
  10. 建议

更多推荐文章

查看全部
  • UI UX Pro Max:让 AI 编码助手具备专业前端设计能力
  • 多模态 AI 应用:图文音视频一体化开发实战
  • ToDesk、顺网云与海马云运行 DeepSeek 模型性能实测
  • AI 辅助编程:如何利用 GitHub Copilot 等工具提升开发效率
  • Spring 事务与事务传播机制详解
  • GitOps 工作流核心概念与 Python 模拟实践
  • ABP vNext WebAPI 应用开发指南
  • AI 魔术师:基于视觉的增强现实特效
  • 本地项目代码上传至 Gitee 完整教程
  • Spring Cloud Gateway 微服务网关核心原理与实战
  • Node.js+Vue 在线票务系统设计与功能实现
  • openTCS WEB 接口实战:从基础调用到自定义指令开发
  • Whisper-large-v3 持续集成:GitHub Actions 自动测试与模型版本灰度发布
  • GitHub 智能客服机器人实战开发与性能优化
  • 程序员如何利用业余时间接私活并实现长远发展
  • 鸿蒙应用开发入门:ArkTS 与 ArkUI 实战路径解析
  • Diffusion Transformer(DiT):将 U-Net 换成 ViT,应用于视频生成与机器人动作预测
  • OpenEuler 虚拟化部署与 Systemd 自动化运维实践
  • AWS Kiro 账号池管理系统 | 将 Amazon Q Developer API 转换为 OpenAI 兼容格式 | 支持多账号池、OIDC 自动认证、令牌自动刷新、Web 管理控制台 | Go
  • AI 编程工具对比:Cursor、GitHub Copilot 与 Claude Code

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online