C MFC慢速运行时使用2D向量

c++ MFC slow runtime with 2D vector

本文关键字:2D 向量 运行时 MFC      更新时间:2023-10-16

我最近在Win32控制台项目中写下了我认为" main.cpp"代码的内容。它完美地构建了解决方案,外部版本版本在30秒内运行并完成,这对于计算的数量很快。

当我使用仅使用1个标准对话框制成的MFC构建的UI用于一些简单的浮点输入时,当必须创建和计算一些2D向量时,该程序本身就会挂起来。

std::mt19937 generator3(time(0));
static uniform_01<std::mt19937> dist3(generator3);
std::vector<int> e_scatter;
for (int i = 0; i <= n; i++)
{
    if (dist3() >= perc_e)
    {
        e_scatter.push_back(1);
        //  std::cout << e_scatter[i] << 'n';
        //  system("pause");
    }
    else
    {
        e_scatter.push_back(0);
        //  std::cout << e_scatter[i] << 'n';
        //  system("pause");
    }
}
string fileName_escatter = "escatter.dat";
FILE* dout4 = fopen(fileName_escatter.c_str(), "w");
for (int i = 0; i <= n; i++)
{
    fprintf(dout4, "%d", e_scatter[i]);
    fprintf(dout4, "n");
    //  fprintf(dout2, "%f", e_scatter[i]);
    //  fprintf(dout2, "n");
};
fclose(dout4);
std::vector<vector<float>> electron;
//  std::vector<float> angle;
**randutils::mt19937_rng rng2;
std::vector<float> rand_scatter;
for (int i = 0; i <= n; i++)
{
    std::vector<float> w;
    electron.push_back(w);
    rand_scatter.push_back(rng2.uniform(0.0, 1.0));
    for (int j = 0; j <= 2000; j++)
    {
        if (e_scatter[i] == 0)
        {
            electron[i].push_back(linspace[j] * (cos((rand_scatter[i] * 90) * (PI / 180))));
            //electron[i][j] == abs(electron[i][j]);
        }
        else
        {
            electron[i].push_back(linspace[j]);
        };
    };
};**

更具体地说,它没有超越特定的循环,我被迫关闭它。我已经让它运行20分钟,看看它是否只是计算出较慢的计算,但仍从中获得0输出。当我有MFC的GUI时,我对代码的调试部分并不好,因为我没有控制台弹出。

尝试将MFC用于GUI和大型2D向量时,我是否缺少一些东西?

第一个循环在完成后计算并吐出输出文件" escatter.dat",但第二组循环永远不会完成,并且内存使用情况不断增加。

linspace [i]是在所有该代码之前计算的,只是它用于填充std :: vector> double for loops for loops的2001个数字的向量。

ive包括此http://pastebin.com/i8a7t38k链接到MFC的一部分,我用来不让这篇文章很长时间阅读。

谢谢。

我同意调试检查是主要问题。但是,如果您的程序运行30秒,则N必须大。

您可以考虑通过使用vector :: reviver;

对内存进行预关注来优化减少内存分配的代码。
std::vector<vector<float>> electron;
//  std::vector<float> angle;
**randutils::mt19937_rng rng2;
std::vector<float> rand_scatter;
electron.reserve(n+1); // worth for big n
rand_scatter.reserve(n+1); // worth for big n
for (int i = 0; i <= n; i++)
{
    std::vector<float> w;
    electron.push_back(w);
    rand_scatter.push_back(rng2.uniform(0.0, 1.0));
    electron[i].reserve(2000+1); // really worth for big n
    for (int j = 0; j <= 2000; j++)
    {
        if (e_scatter[i] == 0)
        {
            electron[i].push_back(linspace[j] * (cos((rand_scatter[i] * 90) * (PI / 180))));
            //electron[i][j] == abs(electron[i][j]);
        }
        else
        {
            electron[i].push_back(linspace[j]);
        };
    };
};**

或不使用push_back(因为您知道所有尺寸)

来重写
std::vector<vector<float>> electron(n+1);
//  std::vector<float> angle;
**randutils::mt19937_rng rng2;
std::vector<float> rand_scatter(n+1);
for (int i = 0; i <= n; i++)
{
    std::vector<float>& w=electron[i];
    w.reserve(2000+1);
    float r=rng2.uniform(0.0, 1.0);
    rand_scatter[i]=r;
    for (int j = 0; j <= 2000; j++)
    {
        float f;
        if (e_scatter[i] == 0)
        {
            f=linspace[j] * (cos((r * 90) * (PI / 180)));
            // f=abs(f);
        }
        else
        {
            f=linspace[j];
        };
        w[j]=f;
    };
};**

在该运行时可能最多减少到几秒钟。

另一种优化

string fileName_escatter = "escatter.dat";
FILE* dout4 = fopen(fileName_escatter.c_str(), "w");
for (int i = 0; i <= n; i++)
{
    fprintf(dout4, "%dn", e_scatter[i]); // save one method call
    //  fprintf(dout2, "%fn", e_scatter[i]);
};
fclose(dout4);

btw:ofStream是编写文件的stl-way,例如

ofstream dout4("escatter.dat", std::ofstream::out);
for (int i = 0; i <= n; i++)
{
    dout4 << e_scatter[i] << std::endl;
};
dout4.close();