2011-09-10 13 views
7

大量のデータがあるので、私は1つの整数または長いデータを大量に格納しているゲームを作っています。パフォーマンス上の理由からクラス全体を使用する必要はなく、必要ではありません。私は整数から1ビットを取り出す2つの方法を見つけました。私は誰がどちらを使うべきか、どちらが速いのかを誰が知っているのだろうかと思っていた。ビットが設定されているかどうかを確認するアルゴリズムはどれですか?

方法:

return (integer & (1 << bit)) != 0;

return (integer >> bit& 0x1) == 1;

+23

時期尚早最適化は悪魔の遊びです – austinbv

+4

あなたには完璧なマイクロベンチマークを試してみてください。 100万回のループで両方を実行し、時間を計る。 – Oded

+0

もう少し速いかどうかにかかわらず、2番目のものは単純な_wrong_であると確信しています。 – bdonlan

答えて

16

あなたがテストしているビットは、あなたがテストしているintよりも「一定」です。したがって、ビットの定数を作ることができます。つまり、シフトを一度行うだけです。例えば:

static final int LEFT_WALL = 1 << 1; 
static final int RIGHT_WALL = 1 << 2; 
static final int BOTTOM_WALL = 1 << 3; 
static final int TOP_WALL = 1 << 4; 

は、その後、あなたのループでは、あなただけではない3(シフト、ループの中であなたは2つのだけの操作やって(ビット単位のANDと比較)している

if ((integer & LEFT_WALL) != 0) 
    // left wall collision 
if ((integer & RIGHT_WALL) != 0) 
    // right wall collision 
... 

をチェックしています比較してください)。

さらに重要なのは(コメントで指摘されているように)速度の向上よりも、各ビットを使用していることをはっきりさせるので、コードを読みやすくなります。

+6

opを保存するよりも、読んで理解するのが簡単です。 – tvanfosson

+0

awsome idea。私は実際に私のプログラムでもXDとほぼ同じ最終的なバールを持っています。ほとんどの人は、これは非常に重要なオプトマイゼーションではないと言っていますが、私はこれを約2400万回実行しなければならないと言っています –

+1

@stasええと、それはおそらくμop融合と共同コストおそらく半サイクルの半分。したがって、この24 * 10^6回の実行は、3ghz CPUで約12millionサイクルまたは約4msを節約します。それは大きな節約です。 – Voo

5

これは実装に依存し、ハードウェアとコンパイラに依存します。実際に何か試行を実行することなく、私は誰が良いと言うことができるとは思わない。

さらに、このコードがタイムクリティカルであり、最適化する必要があるという目に見える証拠がない限り、このようなことは心配しません。このようなマイクロ最適化コードの使用時間は、パフォーマンスのボトルネックであることが分かっていない限り、生産性が低下する可能性は低く、コードの他の部分を最適化することでボーナス性能をさらに上げることができない場合は、コードをプロファイリングして実際のボトルネックが何であるかを確認し、それらの部分を最適化してください。

3

ほとんど違いはありません。

あなたのプラットフォームでは、その両方をプロファイルするしかありません。測定誤差を最小限に抑えるためには、ループ内の大きな数(100e6など)を測定する必要があります。

関連する問題