五次成绩,先上图
在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"; }