【发布时间】:2021-11-22 18:45:13
【问题描述】:
我正在尝试做一些蒙特卡洛模拟,由于这种模拟,它需要大量的迭代,即使对于最小的系统也是如此。现在我想对我之前的代码做一些调整,但是它增加了挂墙时间或运行时间,增加了 10 倍,这使得一周的计算时间超过了两个月。我想知道我是否正在以最有效的方式进行模拟。
在此之前,我使用一组固定间隔来获取模拟的属性,但现在我想记录一组随机间隔来获取系统信息,因为这是最合乎逻辑的做法。但是我不知道该怎么做。
我使用的代码基本上是这样的:
for(long long int it=0; it<numIterations; ++it)
{
if((numIterations>=10) && (it%1000==0))
{
exportedStates = system.GetStates();
Export2D(exportedStates, outputStatesFile1000, it);
}
}
如您所见,在进行调整之前,它正在通过模拟并且仅记录数据,每 1000 次迭代。
现在我想做这样的事情
for(long long int it=0; it<numIterations; ++it)
{
for(int j = 1; j <= n_graph_points; ++j){
for (int i = 0; i < n_data_per_graph_points; ++i){
if (it == initial_position_array[j][i] || it == (initial_position_array[j][i] + delta_time_arr[j])) {
exportedStates = system.GetStates();
Export2D(exportedStates, outputStatesFile, it);
}
}
}
}
在这部分中,初始位置数组只是一个包含大量随机数的数组。彼此内部的两个 for 循环检查每次迭代,如果迭代等于该随机数,则开始记录。我知道这不是最好的方法,因为它检查了大量不必要的迭代。但是,我不知道如何改进我的代码。在这一点上我有点无助,所以任何评论将不胜感激
【问题讨论】:
-
您是否分析过您的代码以验证这实际上是您花费大部分时间的地方?您是否在打开优化的情况下进行构建?
-
“现在我想做这样的事情”——你已经通过代码(而不是通过需求)定义了你想要的功能。这意味着您的代码无疑是正确的并且无法改进,因为根据定义,该代码是您的目标。最好用文字描述您想要的功能,将代码从“定义”降级为“示例”。
-
@JaMiT 正确并不意味着最佳。可能有更快的代码与发布的代码等效,因此也是正确的。目标是找到此代码。无需了解代码的作用。
-
不清楚为什么需要外循环。为什么不直接遍历 i 和 j 并为每个
initial_position_array[j][i]运行正文? -
请在每个备选 sn-ps 中包含对实际评估的调用。更改后的
if的每个比较的一个示例都变为真假可能会有所帮助 - 为什么要导出那些好的样本呢?考虑到控制数字是“随机的”,样本的顺序是否重要?starts recording指的是什么 - 我看到的只是拍摄另一个快照?
标签: c++ algorithm if-statement