次のような C 構造体のインスタンスが多数あります。
struct mystruct
{
/* ... */
unsigned flag: 1;
/* ... */
};
flag
最初は 0 ですが、特定の関数の終了時には 1 でなければなりません。
最も簡単な実装は次のとおりです。
void set_flag(struct mystruct *sp)
{
sp->flag = 1U;
}
しかし、代わりにこれを行うと、パフォーマンスにどのような影響が生じる可能性がありますか:
void set_flag(struct mystruct *sp)
{
if (sp->flag == 0U)
{
sp->flag = 1U;
}
}
メインメモリへの書き込みを避けたいと思っています。最初のバージョンは常に書き込みを行い、2 番目のバージョンはフラグがまだ設定されていない場合にのみ書き込みを実行しますが、ほとんどの場合、フラグは既に設定されています。
パフォーマンスに影響を与える可能性が高いその他の要因 (分岐予測など) は?
これまでのところ、わずかな速度の向上を見てきましたが、データ セットが大きくなるにつれて、さらに重要になることを願っています。
この変更により、大規模なデータセットでプログラムが遅くなるリスクはありますか? もしそうなら、どのような状況でこれが起こる可能性がありますか?