C MFC慢速运行时使用2D向量
c++ MFC slow runtime with 2D vector
我最近在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();
相关文章:
- 在 2D 向量中使用第三个 [ ] 有什么意义?
- 如何在 C++ 中使用它的构造函数初始化 unique_ptrs 的 2D 向量?
- 哪个更快:在 1d 向量中按字符串搜索还是在 2d 向量中按向量搜索?
- 分配具有 2D 向量大小的变量的内存
- 在统一内存 CUDA C/C++ 中分配 2D 向量
- 索引 2D 向量时'Reference to type const..'编译错误
- 查找 2D 向量的位置,该向量是类C++的一个元素
- 如何在 C++ 中的函数中传递 2D 向量的子向量
- 为 2D 向量类创建标量乘法运算符
- 无法使用push_back将整数插入1D/2D向量
- 如何将列附加到现代C 中的2D向量
- parallel_for lambda 函数填充 2D 向量后出错
- 类对象指针C 的2D向量
- 将1D或2D向量传递给同一类的构造函数
- 如何初始化2D向量C
- 在类的构造函数中初始化 2D 向量
- 对通过引用传递的 2d 向量进行排序
- 如何在C 2D向量中找到对象(而不是int)的位置
- 如何在C 中打印一个对象的2D向量
- 双打分类/编辑问题的2D向量