如何通过内存缓存加速C++文本写入?附质数代码优化需求
优化方案:内存缓存写入+质数算法提速
一、内存缓存文件写入实现
把频繁的文件IO替换为内存缓存,使用std::ostringstream存储所有要写入的内容,最后一次性写入文件,能大幅减少磁盘IO开销。
修改后的核心代码:
#include <vector> #include <iostream> #include <fstream> #include <chrono> #include <sstream> // 引入内存流头文件 using namespace std; int main() { cout << "\n\n\n Calculating all Prime Numbers up to 82,000,000"; cout << "\n\n Processing..."; cout << "\n\n "; auto start = chrono::steady_clock::now(); ostringstream oss; // 内存输出流,缓存所有内容 oss << "2\n"; vector<int> primes; primes.push_back(2); // 原试除法循环(后续可替换为更快的筛法) for (int i = 3; i < 82000000; i++) { bool prime = true; for (int j = 0; j < primes.size() && primes[j] * primes[j] <= i; j++) { if (i % primes[j] == 0) { prime = false; break; } } if (prime) { primes.push_back(i); oss << i << "\n"; // 写入内存流而非直接写文件 } } auto end = chrono::steady_clock::now(); chrono::duration<double> elapsed_seconds = end - start; oss << "\n Elapsed Time: " << elapsed_seconds.count() << " seconds\n"; cout << "Elapsed Time: " << elapsed_seconds.count() << " seconds\n\n\n"; // 最后一次性写入文件 ofstream myfile("Primes List.txt"); if (myfile.is_open()) { myfile << oss.str(); myfile.close(); } else { cerr << "Failed to open file!" << endl; } system("pause"); return 0; }
二、质数计算的关键优化(比IO优化更显著)
原代码使用的试除法在8200万范围内效率极低,换成埃拉托斯特尼筛法能将计算速度提升一个数量级,同时结合内存优化进一步提速:
1. 埃拉托斯特尼筛法实现
筛法通过批量标记非质数,避免逐个试除的冗余计算,代码如下:
#include <vector> #include <iostream> #include <fstream> #include <chrono> #include <sstream> using namespace std; int main() { const int MAX = 82000000; cout << "\n\n\n Calculating all Prime Numbers up to " << MAX; cout << "\n\n Processing..."; cout << "\n\n "; auto start = chrono::steady_clock::now(); ostringstream oss; // 使用vector<bool>存储质数标记,每个元素占1bit,大幅节省内存 vector<bool> is_prime(MAX + 1, true); is_prime[0] = is_prime[1] = false; for (int i = 2; i * i <= MAX; ++i) { if (is_prime[i]) { // 标记i的所有倍数为非质数,强制转long long避免溢出 for (long long j = (long long)i * i; j <= MAX; j += i) { is_prime[j] = false; } } } // 遍历收集所有质数并写入内存流 for (int i = 2; i <= MAX; ++i) { if (is_prime[i]) { oss << i << "\n"; } } auto end = chrono::steady_clock::now(); chrono::duration<double> elapsed_seconds = end - start; oss << "\n Elapsed Time: " << elapsed_seconds.count() << " seconds\n"; cout << "Elapsed Time: " << elapsed_seconds.count() << " seconds\n\n\n"; ofstream myfile("Primes List.txt"); if (myfile.is_open()) { myfile << oss.str(); myfile.close(); } else { cerr << "Failed to open file!" << endl; } system("pause"); return 0; }
2. 额外优化点
- 内存优化:
vector<bool>每个元素仅占1bit,8200万范围仅占用约10MB内存,远小于普通数组的320MB,减少内存占用和缓存失效概率。 - 溢出规避:计算
i*i时转为long long,防止i超过sqrt(INT_MAX)时出现整数溢出。 - 流同步关闭:若需进一步加速IO,可在程序开头添加:
关闭C++与C标准流的同步,提升流操作速度。ios_base::sync_with_stdio(false); cin.tie(nullptr);
三、效果说明
- 内存缓存写入:将多次小IO合并为一次大IO,减少磁盘寻道和写入开销,IO耗时显著降低。
- 筛法优化:8200万范围的质数计算时间可控制在几秒内,远小于原试除法的数分钟,是提升整体速度的核心。
内容的提问来源于stack exchange,提问作者user2846501
相关产品推荐
相关产品推荐

