You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过内存缓存加速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,可在程序开头添加:
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    
    关闭C++与C标准流的同步,提升流操作速度。

三、效果说明

  • 内存缓存写入:将多次小IO合并为一次大IO,减少磁盘寻道和写入开销,IO耗时显著降低。
  • 筛法优化:8200万范围的质数计算时间可控制在几秒内,远小于原试除法的数分钟,是提升整体速度的核心。

内容的提问来源于stack exchange,提问作者user2846501

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 01:52:31