2

大家好!

我在我的 DIY 洒水器和鱼缸自动化的 AVR 上取得了不错的进展,但我遇到了一个问题,这让我很烦恼。

哪个 if 语句在 AVR 上运行得更快?(在更少的时钟周期内)多少?

if(temp_sensor[0] < -20)
{
    OCR1A--;
}
else if(tempout > tempset)
{
    OCR1A--;
}

或者

if((temp_sensor[0] < -20) || (tempout > tempset))
{
    OCR1A--;
}

再想一想,我的第二个问题是:哪一个使用的空间更少?

我的结论:首先感谢大家的回答和评论!

主要目标应该是编写一个易于理解的干净代码。

4

4 回答 4

3

编写代码是为了可读性,而不是为了速度。尤其是在那些非常琐碎的情况下,编译器可以很容易地找出正在发生的事情并对其进行优化。

您应该避免第一种方式,因为其中有一些重复的代码,这并不理想。

另外我必须指出,除非优化,否则 || 或 && 被编译为与 if 语句相同的分支指令,因此它们确实提高了代码的可读性,但并没有真正带来任何性能优势。

于 2013-09-12T07:01:44.510 回答
3

您可以尝试(看似)无跳跃的方法:

const int8_t delta = temp_sensor < -20 || tempout > tempset;
OCR1A -= delta;

这有时会给出更短的代码。当然它非常依赖 CPU,不确定 AVR 是否喜欢这样的代码。它也很可能会为操作员的短路产生一个跳跃||。编译器也完全有可能自行优化自己的跳跃。

于 2013-09-12T06:54:38.660 回答
0

添加到unwind,您也可以这样使用它:

OCR1A -= (uint8_t)((temp_sensor < -20) | (tempout > tempset));

| 是按位或。

这将删除JUMP逻辑 OR ( ) 所需的代码||

于 2013-09-12T07:02:37.697 回答
0

这边走

if((temp_sensor[0] < -20) || (tempout > tempset))
{
    OCR1A--;
}

是编写这些条件的更好方法。这更容易理解。至于它是否需要更少的滴答声,这并不重要,除非你做了几十万次,在这种情况下,只需检查它们,看看哪个更好

于 2013-09-12T06:54:55.670 回答