1

プロジェクトの一環として、大きなループ (約 10^6 から 10^7 の繰り返し) 内でマスク計算を行う必要があります。任意の数の最下位ビット (1 ~ 8)、または任意のビットを特定の位置 (7 ~ 0、7 が最上位ビット) に保持する必要があります。メイン コードでマスクを計算しないようにするため、またパフォーマンスのために、次のアイデアを思い付きました (いずれの場合も、パラメーターは 0 から 7 までの符号なし char です)。

1) ヘッダー ファイル (bitops.h など) で定義された 2 つのグローバル配列を使用します。

char mask[8] = {1, 3, 7, 15, 31, 63, 127, 255};
char position[8] = {1, 2, 4, 8, 16, 32, 64, 128};

メモリの待ち時間が原因で待機する必要がある場合があります。

2) 簡単な操作 (マクロ経由) を使用してマスクを計算します。

#define mask(x) ((1 << (x + 1)) - 1)
#define position(x) (1 << x)

ここで、マスクには約 3 クロック サイクル、位置には 1 クロック サイクルしか必要ありません。

何を指示してるんですか?2 番目のオプションは実際には高速ですか? または、最初のオプションを選択した場合、プロセッサは事前に定数をキャッシュしますか?

御時間ありがとうございます!

4

2 に答える 2

1

実際にこれをベンチマークして、有意な差があるかどうかを確認する必要がありますが、一般的な経験則では、単純な計算 (数サイクルなど) の場合はオンザフライで計算を行う方が良いですが、複雑な計算 (10 秒) の場合はサイクル以上) ルックアップ テーブルの方が効率的です。この場合、直接計算するのがよいように見えますが、他にも考慮すべき要素が非常に多く、ベンチマークを実行しないと正確にはわかりません。

于 2013-07-16T11:17:40.893 に答える
1

配列は常にキャッシュにある必要があるため、最初の方が優れていると思います。確認したい場合は、ベンチマークする必要があります。

ただし、このループがボトルネックであると判断しない限り、これについて心配するのに時間を無駄にしないでください。最初に最も明確な方法で実行し、パフォーマンスが問題になる場合は、再設計することを心配してください。

于 2013-07-16T11:18:26.647 に答える