Hy大家!
我的AVR在我的DIY洒水车和鱼缸自动化方面取得了很好的进展,但我遇到了一个问题,这让我感到困扰。
哪个if语句在AVR上运行得更快?(在更少的时钟周期内) 多少钱?
if(temp_sensor[0] < -20)
{
OCR1A--;
}
else if(tempout > tempset)
{
OCR1A--;
}
或者
if((temp_sensor[0] < -20) || (tempout > tempset))
{
OCR1A--;
}
第二个想法,我的第二个问题是: 哪一个使用的空间更少?
我的结论: 首先,感谢大家的回答和评论!
主要目标应该是编写一个易于理解的干净代码。
答案 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
)所需的||
代码。