跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

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

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

晚风告白发布于 2026/3/15更新于 2026/5/218 浏览
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 = ; i < ; i ++){
        cout << ;
    }
     program_end = std::chrono::high_resolution_clock::();
     total_duration = std::chrono::<std::chrono::milliseconds>(program_end - program_start);
    cout <<  << total_duration.() <<  << endl;
     ;
}
0
100
1
auto
now
auto
duration_cast
"time:"
count
"ms"
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. 建议
  • 💰 8折买阿里云服务器限时8折了解详情
  • GPT-5.5 超高智商模型1元抵1刀ChatGPT中转购买
  • 代充Chatgpt Plus/pro 帐号了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 基于 Azure 和 OpenAI 构建智能语音客服系统
  • Stable Diffusion 画质增强:Consistency Decoder 使用教程
  • Python爬虫实战:爬取Chrome Web Store扩展商店数据及导出
  • Flutter mediapipe_core 鸿蒙化适配指南:端侧 AI 推理与手势识别
  • Vue3 Webview 转 Android 虚拟导航栏遮挡问题记录
  • 人工智能应用工程师(高级)课程体系详解
  • 从零搭建 Clawdbot 对接企业微信机器人单向推送指南
  • 利用 GPT 快速梳理 Python 知识脉络与入门指南
  • AI 对话生成 PCB:工具实战、能力边界与工程师未来
  • Stable Diffusion 原理详解(附代码实现)
  • Amazon SageMaker 部署 AIGC 应用:训练、优化、部署与 Web 前端集成实践
  • Llama-2-7b在昇腾NPU上的六大核心场景性能基准
  • 基于 Coze 与 Trae IDE 的 AI 辅助全栈开发实战流程
  • 鸿蒙 4.2 无线调试不可用时的 ADB 调试与 Shizuku 方案
  • 毕业两年转行软件测试:从物业维修到月薪 9K 的职场逆袭之路
  • 前端岗位需求下降 9.89%,AI 时代前端开发的未来在哪里
  • 基于 FastAPI 自动构建 SSE MCP 服务器
  • 大模型基本概念详解:定义、分类与发展历程
  • CSS 基础语法与界面布局实战指南
  • 基于 OpenClaw 与 Claude 的自动化写作工作流搭建

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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