【问题标题】:For loop instead of long if condition in order to reduce computing timeFor循环而不是long if条件以减少计算时间
【发布时间】:2020-05-06 13:50:15
【问题描述】:

我有一些如下所示的代码。我已经简化了它以表达我的观点。它包含一个数组。在第一部分中,数组的每个值减去某个值应与边距值进行比较。 如果满足所有条件,µC 应该停止运行一个简单的函数。 否则,µC 应该使用数组的值进行计算。此计算对每个值都有一些乘法运算。

uint32_t value[8];
uint16_t othervalue;

if ((value[0] < othervalue && value[1] < othervalue && value[2] < othervalue && value[3] < othervalue && value[4] < othervalue && value[5] < othervalue && value[6] < othervalue && value[7] < othervalue)
{
    othervalue = 100;
    simplefunction();
}
else
{
    calculatewithallvalues(values);
}

我注意到我可能会改进代码。仅当不满足该特定值的条件时才需要进行“else”中的计算。因此,在某些情况下,不必对每个值都进行计算。我想出了一个使用 for 循环的不同方法。但是,此代码更长,可能更令人困惑。最后需要额外的 if 循环来说明所有值都满足条件的可能性。

uint32_t value[8];
uint16_t othervalue;
uint8_t calc_needed = 0;
int i;
for (i=0; i <7; i++)
{
    if (value[i] < othervalue)
    {
        //do nothing
    }
    else
    {
        calculatewithvalue(values[i]);
        calc_needed = 1;
    }
if (calc_needed == 0)
{
    othervalue = 100;
    simplefunction();
}

哪个是更好的解决方案还是有第三种解决方案?

【问题讨论】:

  • 第一个解决方案不好,因为语句超出了屏幕的一侧。
  • 撇开 Fiddleling 的愚蠢评论 :) - 恕我直言,您的第一个选择就是这样做,即使阅读和写作有点乏味。确保对它重新排序以使最有可能在表达式中预先失败的测试。
  • 那么,您的calculatewithvalue() 函数有多复杂?任何特定测试失败并导致执行calculatewithallvalues() 的可能性有多大?如果每次计算都很昂贵,并且很可能其中一个条件会失败(但不是全部),那么您的第二个版本应该更快。
  • @500-InternalServerError 如果主要问题是计算本身,优化 if 条件可能不会产生明显的差异。第一个示例将始终重新计算所有内容,无论是仅满足一个条件还是满足所有条件。第二种方法只会重新计算严格必要的内容。
  • 1) 第二个片段中缺少break;。 2)calculatewithvalue(values[i]); 不同于calculatewithvalues(values);

标签: c loops for-loop microcontroller


【解决方案1】:

还有第三种解决方案:


for(i=0; i < 7; i++) {
    if (value[i] < othervalue ) continue;
    break;
    }

if (i == 7) { // loop completed; all values were below othervalue
    othervalue = 100;
    simplefunction();
    }
else    {
    calculatewithallvalues(values);
    }

【讨论】:

  • 这看起来比我的解决方案更好,但它不会将计算限制为仅不满足条件的值。
  • 你的两个片段不等价。我坚持第一个。并且:没有实际需求和功能,这个问题是无法回答的。
猜你喜欢
  • 1970-01-01
  • 2015-05-03
  • 2018-08-28
  • 1970-01-01
  • 2017-07-22
  • 2018-03-27
  • 1970-01-01
  • 2015-08-04
  • 1970-01-01
相关资源
最近更新 更多