9

最近、インタビューについて質問がありました。ビット単位の演算をパフォーマンスの観点から比較するように求められました。

同様に、さまざまなビット演算のパフォーマンスについて簡単に説明します。

この質問はかなり一般的でかなりマシン固有である可能性があると思いますが、これについてはいくつかの一般的なルールがあるはずです。これについては言及する必要があります(私は言及しませんでした:)。

だから-あなたは何に答えますか?

また、C (またはC ++など)でのパフォーマンスを比較することをお勧めします。これらの言語は、コンパイラーがビット関連の最適化を実行するためのより多くのスペースを提供すると想定しているためです。

ありがとうございました。


さて、完全な問題のコンテキスト。

インタビューにはいくつかのセクションがあり、それらのいくつかは本当にケーキであり、いくつかは悪夢でした。ビット関連のセクションはちょっと大変で、次のような質問が含まれていました。

  • 浮動小数点数の仕様float、、double

  • 高速float->int変換(範囲がわかっている場合はさらに高速)

これらはそれほど難しいものではありませんでしたが、このビット関連セクションの最後の質問として、私が知っているビット演算を列挙し、それらのパフォーマンスを比較するように求められました。

「アーキテクチャ、コンパイラ、...具体的、実際には問題ではない、ビット単位はすでにかなり低レベルである」など、あまり説明的ではないものに答えましたが、この答えはひどいものだと思います。

4

2 に答える 2

12

ビット演算を同等の算術演算と比較することを意味すると思います。

たとえば、「?a = (a>>1)より速い」a = (a / 2)

多くの場合、このような単純な操作(ソフトウェアとハ​​ードウェアの最適化、パイプライン化、キャッシングなどのさまざまな理由で)は実質的に1 CPUサイクルかかるため、最近のプロセッサでは違いが見られない可能性がありますが、複数のALUを介して並列処理する場合でも、算術演算とビット演算を組み合わせると、CPUの並列経路をより有効に活用できるというメリットがあります。高水準言語で記述した場合、コンパイラーはコードを最適化して、より適切な形式を使用する可能性が非常に高いため、コードの記述方法に関係なく、同じパフォーマンスが得られます。

ただし、ビット単位の演算が単純な算術/論理よりも大幅に高速になる場合があります。たとえば、いくつかのビット単位の演算(すべてを効果的に処理する)を使用して、32ビットまたは64ビット値のすべてのバイトにいくつかの演算を適用できます。同時にバイト)、それ以外の場合は、インクリメンタルに実行するために多くのループと比較ロジックが必要になります。達成できることのいくつかの素晴らしい例については、ここを参照してください。このような場合、多くの場合、パフォーマンスに大きなメリットがあります。(正確なゲインは、ターゲットとするCPUに大きく依存しますが)

(あるいは、「XORよりも高速なシフト演算」を意味している可能性があります。この場合、最新のプロセッサでは、ほとんどの場合、答えは「いいえ」です。ほとんどのビット演算は高速です。しかし、それはかなり無意味な質問です。聞く、質問する...)

于 2011-02-28T23:25:32.383 に答える
3

これは非常に奇妙な質問です。まず第一に、言語は無関係である必要があるためです。コンパイルされた言語で記述している限り、ビット単位の操作は、最も単純なアセンブリ言語であっても、単一のアセンブリ命令にコンパイルする必要があります。

次に、その単一のアセンブリ命令がプロセッサに到達すると、単一のサイクルで評価する必要があります。ビット単位の命令は非常に単純です。スペースが不足しているプロセッサが数サイクルでシフト操作を実装する可能性があります(すばやく実行するには他のプロセッサよりもはるかに多くの回路が必要です)が、最近のマシンではほとんどありそうにないため、シフトでさえ1サイクルにする必要があります指示。

ウィキペディアがこの問題について言っていることは次のとおりです。

ビット単位の演算は、個々のビットのレベルで1つ以上のビットパターンまたは2進数を操作します。ほとんどの古いマイクロプロセッサでは、ビット単位の演算は加算および減算演算よりもわずかに高速であり、通常は乗算および除算演算よりも大幅に高速です。最新のアーキテクチャでは、これは当てはまりません。ビット単位の演算は、一般に加算と同じ速度です(ただし、乗算よりは高速です)。

お役に立てれば!

于 2011-02-28T23:27:16.050 に答える