1

1) 32 ビット CPU では、32 個のブール値の配列にアクセスするのと、1 ワード内で 32 ビットにアクセスするのとのどちらが速いですか? (N 番目の要素の値をチェックしたいと仮定し、配列インデックスとしてビットマスク (N 番目のビットが設定されている) または整数 N のいずれかを使用できるとします。)

すべての一般的なコンピューター アーキテクチャはワード レベル (32 ビット、64 ビットなど、並列処理) でネイティブに動作し、サブワード ビットへのアクセスには余分な作業が必要になるため、配列の方が高速になるように思えます。

コンパイラが異なれば表現も異なることはわかっていますが、基盤となるハードウェア アーキテクチャによって答えが決まるようです。それとも、答えは言語とコンパイラに依存しますか?

そして、2) この配列がクライアントとサーバーの間で渡される状態を表している場合、速度の答えは逆ですか? この質問は、「ビット/ビット演算子を使用してオブジェクトの状態を制御する方法は?」という質問を読んだときに思い浮かびました。

PS はい、これを自分でテストするためのコードを書くことはできますが、そうすると SO コミュニティは協力してくれません!

4

6 に答える 6

4

キャッシュ ラインに収まらない理論的に高速なソリューションは、さまざまな状況に応じて、理論的に低速なソリューションよりも遅くなる可能性があることに注意してください。プロファイリングによって決定されたように、これが実際に高速である必要があるものである場合は、両方の方法をテストして確認してください。そうでない場合は、おそらく配列である、よりクリーンなコードのように見えるものを実行します。

于 2009-02-05T18:35:21.947 に答える
3

コンパイラとアクセス パターンとプラットフォームに依存します。Raymond Chen は優れた費用便益分析を行っています: http://blogs.msdn.com/oldnewthing/archive/2008/11/26/9143050.aspx

x86 以外のプラットフォームでも、ビットの使用は禁止されている可能性があります。これは、少なくとも 1 つの PPC プラットフォームがマイクロコード化された命令を使用して変数シフトを実行し、他のハードウェア スレッドで厄介なことを行う可能性があるためです。

したがって、それは勝利になる可能性がありますが、それが良い面と悪い面のコンテキストを理解する必要があります。(とにかく一般的なことです。)

于 2009-02-05T18:54:07.447 に答える
2

質問 #1 について: はい、ほとんどの 32 ビット プラットフォームでは、ブール値の配列の方が高速である必要があります。これは、32 ビットで整列された各値を配列にロードし、それを 0 に対してテストするだけだからです。つまり、すべての作業に加えて、ビット操作のオーバーヘッドが発生します。

質問 2 について: 繰り返しますが、ネットワーク経由でデータを送信するのは、CPU やメイン メモリ内のデータを操作するよりも大幅に遅いため、単語を 1 つでも送信することによるオーバーヘッドは、単語を整列させたり、少しいじる。

于 2009-02-05T18:19:55.550 に答える
1

これは、ビットをテストするために 0 != (値 & (1 << インデックス)) によって生成されたコードです。

00401000  mov         eax,1 
00401005  shl         eax,cl 
00401007  and         eax,1 

そしてこれは値[インデックス]によってbool[]をテストします:

00401000  movzx       eax,byte ptr [ecx+eax]

最適化されないループを配置する方法がわかりません。bool[] に投票します。

于 2009-02-05T18:51:11.103 に答える
0

一度に複数の値をチェックする場合は、並行して行う方が明らかに高速です。1 つの値のみをチェックしている場合は、おそらく同じです。

それ以上の答えが必要な場合は、いくつかのテストを書いて、私たちに戻ってきてください.

于 2009-02-05T18:18:54.587 に答える
0

単純なランダムアクセスには、おそらくバイト配列の方がフルワード配列よりも優れていると思います。

フルワードサイズを使用するよりもキャッシュの局所性が向上し、ほとんど/すべての一般的なアーキテクチャでバイトアクセスが遅くなるとは思いません。

于 2011-11-16T13:22:56.103 に答える