2

みなさんこんにちは!

DIY スプリンクラーと水槽の自動化に向けて AVR を順調に進めていますが、気になる質問に出くわしました。

どちらの if ステートメントが AVR でより速く実行されますか?(より少ないクロック サイクルで) どの程度ですか?

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

または

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

考え直して、私の 2 番目の質問は次のとおりです。使用するスペースが少ないのはどれですか?

私の結論: まず第一に、皆さんの回答とコメントに感謝します!

主な目的は、理解しやすいクリーンなコードを作成することです。

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));

| ビットごとの OR です。

JUMPこれにより、論理 OR ( ) に必要なコードが削除され||ます。

于 2013-09-12T07:02:37.697 に答える