c ++ MFC使用2D矢量减慢运行时间

时间:2016-06-24 21:21:16

标签: c++ debugging visual-studio-2015 mfc console-application

我最近写完了我认为的东西" main.cpp" Win32控制台项目中的代码。它完美地构建了解决方案,外部发布版本在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]);
        };
    };
};**

更具体地说,它没有超过特定的for循环,我被迫关闭它。我让它运行20分钟,看它是否只是计算速度慢,但仍然得到0输出。因为我没有控制台弹出,所以当我从MFC获得这个GUI时,我在代码的调试部分并不是那么棒。

当我尝试将MFC用于gui和大型2D矢量时,是否存在我遗漏的东西?

第一个循环计算并吐出输出文件&#39; escatter.dat&#39;完成后,第二组循环永远不会完成,内存使用量不断增加。

linspace [i]在所有这些代码之前计算,并且只是用于填充std :: vector&gt;的2001数字的向量。电子矢量在双循环中。

我已将此http://pastebin.com/i8A7t38K链接包含在代码的MFC部分中,而这些代码是我用来使这篇文章真的很难读的。

谢谢。

1 个答案:

答案 0 :(得分:0)

我同意调试检查是主要问题。 但如果你的程序运行30秒,那么n必须很大。

您可以考虑通过使用vector :: reserve预先分配内存来优化代码以减少内存分配;

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, "%d\n", e_scatter[i]); // save one method call
    //  fprintf(dout2, "%f\n", e_scatter[i]);
};
fclose(dout4);
BTW:ofstream是编写文件的唯一方式,比如

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