我最近写完了我认为的东西" 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部分中,而这些代码是我用来使这篇文章真的很难读的。
谢谢。
答案 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();