奇技淫巧:cout的速度最高提升近百倍,相比printf提升近50倍

五次成绩,先上图

2a745e2795284854a5ce9d27a0d3581c.pngb488a6e70a014356a0ee31c9564bc403.png 

 

 fa5329f609e94675b59aa5d2cb2f7f66.png

862bfbd875024e3fa8f0271b2162243b.png 378df238473c4f06a7329903d77cdc9a.png 

3763d08743e743348fa50fbc5e7fb6ba.png 

 

 

在c++中,cout是一个输出流,用于在控制台打印。但是在某些情况下,cout却成了性能瓶颈,大家一定遇到过printf能过,cout却超时的情况。

如何实现几十倍甚至上百倍的性能提升:

    1.    减少系统调用:每次调用如 printf 或 std::cout 输出时,背后都可能涉及到复杂的缓冲区管理和系统调用。系统调用是操作系统提供给程序进行各种操作的接口,如读写文件或输出到控制台,这些操作相对较慢。
    2.    优化I/O操作:I/O操作通常是计算机程序中最慢的部分之一,尤其是涉及到磁盘或网络时。即使是向控制台输出,也比内存操作慢得多。批量处理可以减少这些操作的次数。

所以使用批量处理即可

为了减少endl;和\n对纯粹cout和printf的性能影响,我没有使用这两个换行符,后面我发现添加\n后性能提升会大幅缩减,甚至在数据少的情况下不如原本的cout,有人懂怎么回事吗

#include <chrono>
#include <iostream>
#include <string>
#include <vector>


class IntWriter {
public:
    // 预留足够的空间以减少动态扩容的开销
    IntWriter() {
        numbers.reserve(10000); // 假设最多有10000个整数
    }

    // 添加一个整数到缓冲区
    void addInt(int num) {
        numbers.push_back(num);
    }

    // 一次性输出所有整数
    void flush() {
        std::string output;
        for (int num : numbers) {
            output += std::to_string(num);
        }
        std::cout << output;
    }

private:
    std::vector<int> numbers;
};



int main() {
    int a;

    //输出次数
    std::cin >> a;
    IntWriter writer;

    //传统cout
    auto coutstart = std::chrono::high_resolution_clock::now();
    for(int i = 0; i < a; i++) {
        std::cout << i;
    }
    auto coutend = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::milli> elapsed = coutend - coutstart;

    //优化cout
    std::ios_base::sync_with_stdio(false);
    std::cout.tie(NULL);
    auto faststart = std::chrono::high_resolution_clock::now();
    for (int i = 0; i < a; i++) {
        writer.addInt(i);
    }
    writer.flush();
    auto fastend = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::milli> elapsed1 = fastend - faststart;

    //printf
    auto printfstart = std::chrono::high_resolution_clock::now();
    for (int i = 0; i < a; i++) {
        printf("%d", i);
    }
    auto printfend = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::milli> elapsed2 = printfend - printfstart;

    //输出结果
    std::cout << "\ncout: " << elapsed.count() << " ms\n";
    std::cout << "fastcout: " << elapsed1.count() << " ms\n";
    std::cout << "printf: " << elapsed2.count() << " ms\n";
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值