2009-06-27 5 views
7

最近、私は変数が偶数か奇数かを調べる必要がある場合、変数の最後のビットが0に等しいかどうかを知ることができたことを発見しました。この発見は実装されたときにはモジュロ2機能はより速く走った。最後のビットを見て数字が一致するかどうかを確認します。このような他の "トリック"はありますか?

このような「トリック」はありますか?ビットを使って作業すると、他の計算が置き換えられ、機能の実行時間が向上しますか?

+6

あなたはコンパイラの最適化を可能にすることによって、同じスピードアップを得たかもしれません。それははるかに貴重な "トリック"です。簡単に自動化された最適化に時間を費やす必要はありません。とにかくコンパイラがそれらを行うでしょう – jalf

+0

@jalf - 最適化を有効にすることについてのアイデアをありがとうございます。私は経験が不十分で、C++の学習を始めました。私はあなたの提案を念頭に置いていきます。 – zeroDivisible

答えて

22

あります。その塩の価値があるC++コンパイラは、同一のマシン命令に対してn % 2n & 1をコンパイルします。

最適化としてビットツイドーリングハックを使用することに注意してください。まず、最適化している関数がボトルネックであることは必ずしも明らかではありません。第二に、結果コードは通常、維持するのが難しく、誤ったバグや微妙なバグがある可能性が高くなります。これは有名な引用クヌス引用の意味です。「時間の約97%を占める小さな効率を忘れるべきです。時期尚早の最適化はすべての悪の根源です。」あなたの努力を保存します。

あなたが本当にこの主題を追求しなければならない場合は、Bit Twiddling Hacksに面白いハッキングの良いリストが含まれています。

1

modulo 2の操作が%2と表示されている場合、C++は通常、ビット単位の操作を行わずに最適化することに注意してください。

すべて、このようなトリックを理解するために啓発されるだろうが、コンパイラ(またはコンパイラライタが)すべての最適化が可能に取得するためにハードワークをしていることを知って喜ばなければなりません。あなたは2のべき乗で定数と仕事を使用している場合

何を忘れてはならないこと、である、最適化は、コンパイラは、マシンのバイナリ演算能力を活用するため、可能性が高くなります。さらに行く


、私はシステムが低レベルでどのように機能するかについての知識を得ることを示唆しています。

この目的のために、ここで参照する学習の練習はvery usefulとなります。しかし
は、
cryptic coding with complicated operations jammed together(たとえば、ソースコードのバイト数が少ない中でそれをすべて行うために)良くありません。

あなたが第3の一時変数なしで、「場所で」2つの32ビット変数を入れ替えることができることを知って良いかもしれ - XOR演算を使用して。しかし、2/4バイト変数bit fieldsの場合は、hhow cross compilation requires big-endian and little-endian handlingを知ることがより便利です。ビットフィールドについて語る

は、別のstackoverflow conversation on their popularityのことを思い出します。 (あなたの質問に完全に関係していませんが)良い読書でもありますか?


要約すると、私はあなたに何ができるかを学ぶことに完全に同意します。コードをよりよく実行するためにそれらを使用したいと思います。たとえば、より良い実装を行うのに役立つwhat can programmers to do make better cache optimizationのような概念になると強く感じています。 Hacker's Delight(グーグル書籍):

4

さて、このトピックに関する素晴らしい本があります。

Amazon.co.jp:Hacker's Delight

4

は、私は同等のビット演算によりモジュロ2つの計算の使用を交換してより高速な実行時間を生じたことを疑うlarge repository of bit twiddling hacks here

+0

非常にいいコレクションポール、このリンクに感謝します。 – zeroDivisible

3

たくさんあります。あなたが始めることができる1つのオンライン "コレクション"はhttp://www-graphics.stanford.edu/~seander/bithacks.html

です。パフォーマンスの向上が絶対に必要な場合を除いて、コードでビットツイダートリックを使用することをお勧めします。これらのトリックは非常に判読不能で、 "これは動作しません"と感じるので、バグを突き止めようとしているときには、コードをデバッグしようとしている人にとっては効果的です。

1

ここはすてきなトリックです。大量の検索が必要なデータベースフィールドに日付を格納する場合は、日付を日付形式で格納せず、代わりにYYYYMMDD形式の整数として格納します。データベースは、日付構造よりもずっと速く整数を検索できます。

関連する問題