C avr if语句优化速度或大小

C avr if语句优化速度或大小,c,optimization,if-statement,avr,C,Optimization,If Statement,Avr,大家好 我在我的自动喷水灭火器和鱼缸自动化方面取得了很好的进展,但我遇到了一个问题,这让我很烦 哪个if语句在AVR上运行得更快?(以更少的时钟周期) 多少钱 if(temp_sensor[0] < -20) { OCR1A--; } else if(tempout > tempset) { OCR1A--; } if(温度传感器[0]tempset) { OCR1A-; } 或 if((温度传感器[0]温度设置)) { OCR1A-; } 再想一想,我的第二个

大家好

我在我的自动喷水灭火器和鱼缸自动化方面取得了很好的进展,但我遇到了一个问题,这让我很烦

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

if(temp_sensor[0] < -20)
{
    OCR1A--;
}
else if(tempout > tempset)
{
    OCR1A--;
}
if(温度传感器[0]<-20)
{
OCR1A-;
}
else if(tempout>tempset)
{
OCR1A-;
}

if((温度传感器[0]<-20)| |(温度输出>温度设置))
{
OCR1A-;
}
再想一想,我的第二个问题是: 哪一个占用更少的空间

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

主要目标应该是编写一个简洁易懂的代码。

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

const int8_t delta = temp_sensor < -20 || tempout > tempset;
OCR1A -= delta;
const int8_t delta=temp_传感器<-20| tempout>tempset;
OCR1A-=δ;
这有时会产生更短的代码。当然,它非常依赖CPU,不确定AVR是否喜欢这样的代码。它很可能也会对
|
运算符的短路产生跳转。编译器也完全有可能在跳转过程中自行优化自身。

这样做

if((temp_sensor[0] < -20) || (tempout > tempset))
{
    OCR1A--;
}
if((温度传感器[0]<-20)| |(温度输出>温度设置))
{
OCR1A-;
}

是写这种条件更好的方法。这更容易理解。至于它是否需要更少的滴答声,这并不重要,除非你做了数十万次,在这种情况下,只需检查它们,看看哪一个更好,写代码是为了可读性,而不是速度。特别是在那些非常简单的情况下,编译器可以很容易地找出发生了什么并对其进行优化

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

另外,我必须指出,除非进行优化,| |或&,否则它们会像if语句一样编译为分支指令,因此它们确实会提高代码的可读性,但实际上不会带来任何性能优势。

除了“展开”之外,您还可以这样使用它:

OCR1A -= (uint8_t)((temp_sensor < -20) | (tempout > tempset));
OCR1A-=(uint8_t)((温度传感器<-20)|(温度输出>温度设置));
|
是按位或


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

我猜您的意思是第二个代码中的|。并且也遗漏了)在-20之后。不要试图做过多的优化。编写干净易读的C代码,让编译器为您进行优化。它会比你做得更好。如果您真的需要超级优化的代码,那么就在ASM中编写它。这是管理代码时钟周期消耗的唯一方法。我怀疑您是否受到任何方式的CPU限制,为什么还要担心if语句,因为我猜您使用ADC或OneWire连接的温度传感器将需要数千个周期才能读取。+1表示CPU依赖性。在AVR上,您没有像ARM那样的“条件执行”机制。因此,您很可能会以test、branch(如果满足)、test branch(如果未满足)或类似的方式结束。这很可能是编译器为我看到的关于这个问题的任何建议所产生的结果。所以我坚持@LtWorf的观点:为可维护性而写。让编译器处理循环。如果cylce fiddling很重要,请自己编写程序集。
OCR1A -= (uint8_t)((temp_sensor < -20) | (tempout > tempset));