同じパターンを持つ関数を最適化するために、2つの実装方法を検討しています。 この関数の環境は、組み込みソフトウェアの割り込みの内部で使用できます。これは、スピード能力を考慮する必要があるため、私は難しさに直面しています。 私の意見では、次のケース1と2には同じ速度機能があります。しかし、私の同僚は、ポインタを使って最初のケースにアクセスする必要があるので違いがあると言いましたが、2番目のケースはそうではありません。 どちらがより高速ですか? 効率的なコードをスピードで実装するには、あなたの助けが必要です。関数の入力引数として構造体と変数を使用する速度の差
typedef struct
{
unsigned char member1;
unsigned char member2;
..
unsigned char member10;
} my_struct
my_struct input[10];
void My_ISR1(void)
{
...
sub_func1(input[1]);
return 0;
}
void My_ISR2(void)
{
...
sub_func1(input[2]);
return 0;
}
void sub_func1(my_struct my_struct_input)
{
if(my_struct_input.member1 < my_struct_input.member2)
{
...
}
...
return 0;
}
CASE2)
unsigned char member1of1;
unsigned char member2of1;
...
unsigned char member10of10;
void My_ISR1(void)
{
...
sub_func1(member1of1, ..., member10of1);
return 0;
}
void My_ISR2(void)
{
...
sub_func1(member1of2, ..., member10of2);
return 0;
}
void sub_func1(unsigned char member1,
unsigned char member2, ...,
unsigned char member 10)
{
if(member1 < member2)
{
...
}
...
return 0;
}
特定のユースケースに対して、ある実装が他の実装より速いか、コンパイラで、コード内で、ハードウェア上で問題が発生するかを確認する唯一の方法は、それを測定することです。 – mjs
あなたは構造体へのポインタを渡していません。投稿した両方のスニペットは同じ量のデータをスタックにコピーします。あなたは、毎回(今やっているように)それをコピーするのではなく、よりパフォーマンスの高い(そしておそらくコンパイラのインライン化が容易な)参照を使って構造体を参照(つまりポインタを使用)する必要があります。それ以外は、パフォーマンス上の理由だけでなく、実際のコンシューマに透過的な同じ方法で構造体インスタンスを渡すことを可能にするために、10個のフィールドを複製するのではなく、 'struct'を使用する必要があります。 – Groo
構造体*をコピー*によって渡しているので、ポインタによるアクセスはありません。この種のマイクロ最適化はめったに生産的ではありません。コンパイラにそのようなことを任せ、効率的なデータ構造とアルゴリズムを使用して設計レベルでの最適化に集中します。最終的には、「より速い」という質問に対する答えは、それを測定することによってのみ答えることができ、答えはコンパイラ、ターゲット、およびコンパイラオプションによって異なることさえあります。 – Clifford