在函数定义中有条件执行计算的最佳方法

时间:2018-12-10 22:30:04

标签: c++ optimization

我有一个仿真,它针对大量步骤(大约1e11)执行了一组计算。但是,并非每次仿真都需要进行所有计算(尽管对于任何仿真,都必须在每个步骤中进行相同的计算)。由于模拟运行需要花费大量时间,因此即使每个步骤只有一个if语句也会对总体计算时间产生重大影响,因此我尝试消除对if语句进行评估的需求每一步。
对于一小部分计算,只需定义不同的函数并使用正确的计算组合(即

),就可以轻松实现。
void justA() {
  // calculate A
}
void justB() {
  // calculate B
}
void both() {
  // calculate A
  // calculate B
}

并使用函数指针预先确定要使用的功能(例如在this问题中)。但是对于更多可能的计算,这变得不切实际。显然,这可以通过一系列if语句来解决,即

if (calculateA) {
  // calculate A
}
if (calculateB) {
  // calculate B
}
// ...
if (calculateZ) {
  // calculate Z
}

但是对于1e11步仿真,这需要对每个计算进行1e11评估(所有评估都将得出相同的结果)。

我的问题:有没有一种方法,而无需每次调用​​if都不需要为每种可能的计算组合硬编码不同的函数?


注意-必须在运行时完成,而不使用C ++预处理程序指令。

1 个答案:

答案 0 :(得分:-1)

我假设您没有执行1e11 = 100,000,000,000(千亿个)与众不同的操作。如果这样做,我想您有一个 lot 内存可以存储该程序。相反,我假设您可以按某种顺序执行多次的操作要少得多。

该订单如何确定?解决方案将在很大程度上取决于此。

请注意,if的成本实际上(基本上)为零, if 分支预测器成功预测了分支方向。在实践中(尤其是在像您这样的场景中),它通常会变得正确。问题是分支预测变量的查找表的大小。它不足以记住数百万个分支。但是,如果您可以将分支减少到一个小数目-也许通过使单个外部循环遍历函数指针数组的元素并依次调用每个分支-您可以依靠分支预测器每次都正确处理它(分支将始终导致循环的开始(最后一次除外)。

在真实的硬件上,昂贵的位不是if,而是分支,并且大多数其他控制流构造(例如do / whilefor也涉及分支。