【问题标题】:most efficient way to have a if statement in C++在 C++ 中使用 if 语句的最有效方法
【发布时间】: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


【解决方案1】:

回答了隐含的问题
[什么是]在 C++ 中拥有 [an] if 语句的最有效方法(所有这些应该是等效的),但是
假设导出之间的不同间隔是logical,我该如何充分编码?

保持理智的蒙特卡罗控制,将nextExport 变量初始化为您喜欢的随机值,并且只要it 等于nextExport,导出并增加nextExport 下一个随机间隔。

【讨论】:

    【解决方案2】:
     if (it == initial_position_array[j][i] || it == (initial_position_array[j][i] + delta_time_arr[j]))
    

    这两种表达方式都可以使用引用。(请根据您的方便使用有意义的名称)

    int& i_p_a = initial_position_array[j][i];
    int& i_p_a_d = (initial_position_array[j][i] + delta_time_arr[j]);
    

    现在你的最终 if 语句将是可读和可维护的。

    if (it == i_p_a || it == i_p_a_d) {
         exportedStates = system.GetStates();
         Export2D(exportedStates, outputStatesFile, it);
    } 
    

    【讨论】:

      【解决方案3】:
      1. 改为使用三元/条件运算符(表达式 1 ? 表达式 2 : 表达式 3)。

      2. expression2:只有在 expression1 返回 true 时才会执行。

      3. expression3:只有当 expression1 返回 false 时才会执行。

      4. 它比嵌套的 if-else 语句更有效。

      5. 它也消除了代码中的分支。

      【讨论】:

      • 你确定吗? stackoverflow.com/questions/3565368/ternary-operator-vs-if-else 上的答案表明,尽管该帖子已有 10 年历史,但很可能不再有显着差异
      • 除了可读性的下降,我仍然认为三元运算符避免了分支,至少我的 HLSL 着色器代码从中受益。
      • 嗯,为了正确使用三元运算符,在 OPs 代码中缺少 else 分支。我错过了什么吗?
      • 不要以为你可以比你的编译器更好地优化琐碎的东西。
      • 将 nullptr 扔到三元的 else 部分。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-01
      • 1970-01-01
      相关资源
      最近更新 更多