avr if语句优化速度或大小

时间:2013-09-12 06:49:14

标签: c optimization if-statement avr

Hy大家!

我的AVR在我的DIY洒水车和鱼缸自动化方面取得了很好的进展,但我遇到了一个问题,这让我感到困扰。

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

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

或者

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

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

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

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

4 个答案:

答案 0 :(得分:3)

你可以尝试(看似)无耻的方法:

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

有时可以提供更短的代码。当然它非常依赖于CPU,不确定AVR喜欢这样的代码。很可能也会为||运算符的短路产生跳跃。编译器也完全可以通过它自己的跳转来优化自己。

答案 1 :(得分:3)

编写代码以提高可读性,而不是速度。特别是在那些非常简单的情况下,编译器可以很容易地弄清楚发生了什么并对其进行优化。

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

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

答案 2 :(得分:0)

这样

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

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

答案 3 :(得分:0)

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

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

|是按位OR。

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