この男は、(Cコンパイラでの)バイナリ検索は、生成されたコードからのハードコードされたifブランチよりも遅いと異常に主張しています。(Clojureコードと奇抜なタイトルを許してください-これは、この男が作るのは一般的にコンパイラーに関連していると主張しています)。
彼は書く
私はこの種のコードを時々暗い場所で見ました。男性が自分のプロセッサがどのように機能するか、Cコンパイラがどのように機能するか、データ構造を知っているとき、そして実際にループを高速にする必要があるとき、彼は時々この種のことを書きます。
これは、RealProgrammersが作成する一種のコードです。
これは二分探索の例です(Clojureを許してください)
Start: (1 2 3 4 6 8 9 10 11 12)
Finish: ((((1) (2)) ((3) ((4) (6)))) (((8) (9)) ((10) ((11) (12)))))
次に、ハードコードされた値に基づいている場合、バイナリ検索を分岐された生成コードに置き換えます。
(defn lookup-fn-handwritten [x]
(if (< x 6)
(if (< x 3) ; x is < 6
(if (< x 2) ; x is < 3
(if ( < x 1) ; x is < 2
0 ; < 1
1) ; 1 <= x < 2
3) ; 2 <= x < 3
(if (< x 4) ; 3 <= x < 6
4 ; 3 <= x < 4
2)) ; 4 <= x < 6
(if (< x 10) ; 6 <= x < 10
(if (< x 9) ; 6 <= x < 9
(if (< x 8)
2 ; 6 <= x < 8
3) ; 8 <= x < 9
3) ; 9 <= x < 10
(if (< x 11) ; 10 < x
(if (< x 12) ; 11 <= x
1 ; 11 <= x < 12
0)
0)))) ; 12 <= x
http://www.learningclojure.com/2010/09/clojure-faster-than-machine-code.html
私の質問は-生成されたコードとハードコード値からの分岐ハードコードがバイナリ検索よりも効率的であるかどうかです。(どの言語でも-しかし、作者はこれがCで機能すると主張しています-そして、JVMでのみそれを示しているようです)。
(リンクされた投稿の風変わりなタイトルをもう一度失礼します-それはただの狂気です。)