2011-10-10 4 views
2

最近、プログラミングの実践、設計などについて多くの記事を読んでおり、乗算をビットシフトとして実装することによる実際のパフォーマンスの向上について興味がありました。ビットシフトを使用した高速乗算による性能向上

私が読んでいた例は、よく使われているルーチンでx * 320を(x < < 8+ x < < 6)として実装することを奨励していました。

これは現代のコンパイラとどのように関連していますか?パフォーマンスが大幅に向上した場合、コンパイラはこれらの「簡単な乗算」を必要に応じて自動的にビットシフトに変換できませんか?

高速乗算を実現するために誰もこの方法でビットシフトに頼らざるを得ませんでしたか?どのようなパフォーマンスの向上が期待できますか?

+0

あなたは「どのような性能向上が期待できますか?」と尋ねているので、この種の議論は本当にあなたを誤解させる可能性があります。*あらゆる種類のマイクロ最適化は、コンパイルするCPUループ実際に多くの使用を参照してください。これは、非常に特殊なコードカテゴリです。人々がコンパイルするほとんどのアプリケーションは、システムライブラリ、I/O、DBアクセスなどでほぼすべての時間を費やします。スタックに収まる関数呼び出しを大部分削除することによってのみ最適化できます。コンパイラはあなたのためにそれを行うことはできません。 –

+0

便利な情報ありがとうございました。 – 8bitcartridge

答えて

3

はい、これらのほとんどはコンパイラによって処理されます。彼らもかなり積極的です。だからあなた自身で行う必要はほとんどありません。 (特に可読性を犠牲にして)

しかし現代のマシンでは、乗算はシフトよりずっと遅いというわけではありません。したがって、2つのシフトよりも多くを必要とする任意の数は、乗算を使用する方が良いでしょう。コンパイラはこれを知っており、それに応じて選択します。

EDIT:

私の経験から、私は、コードが(コンパイラが実際に最適化しようとしません)SSEの組み込み関数を経由してベクトル化されていない限り、この領域でコンパイラをしのぐことができていたことがありません。

+0

偉大な答え、明確なすべて。私はちょうど興味があります:これは近年大きく改善されたものでしたか?私の質問で言及した記事は良い〜16歳であり、特にVS6を多く指していました。 – 8bitcartridge

+0

最近私はよく分かりません。私が活動していれば(〜5年)、コンパイラは常にこの最適化を行ってきました。しかし、私はこれらの「強度低下」の最適化がそれよりもずっと古いと想像することができます。 – Mysticial

+0

このトリックは17〜18年前の16ビットアセンブリで使われました。当時は64ビットx86上のSSE命令と比べると、はるかに高速だった。 – Alexander

関連する問題