2012-04-17 12 views
0

をチャイルズ:効率が選んだ、私は次のコードを持っている

 NodePtr bestChild = (diff < 0) ? node->child1 : node->child2; 
     NodePtr otherChild = (diff < 0) ? node->child2 : node->child1; 

をbestChildとotherChild変数を設定するための任意のより効率的な方法はありますか?

注:difffloatであり、比較はかなり長いです。私は1つの比較をしないが、私はそれが最良の方法であることはよく分からない

 NodePtr bestChild = (diff < 0) ? node->child1 : node->child2; 
     NodePtr otherChild = (bestChild == node->child2) ? node->child1 : node->child2; 

この場合:

はまた、私は次の解決方法を試してみました。

+0

比較フロートが0になっていることがボトルネックですか?私はブランチングそのものが[分岐予測ミス](http://en.wikipedia.org/wiki/Branch_misprediction)のためにはるかに大きな影響を及ぼすことを期待していますが、私は実際にこの問題について専門家ではありません。 – amit

+0

はい、私は比較が高価な操作であると確信していますが、分岐を避けることが可能であれば、それは素晴らしいでしょう。 – Alex

+0

この操作を高速化できますか?私は、[IEEE754-2008](http://en.wikipedia.org/wiki/Floating_point#Internal_representation)のために、私が正しく覚えていれば(もう一度専門家ではない)、記号は単なるMSBであるので、実際にボトルネックになっている場合はハッキングするか、それが不可能な特殊な表現ですか? – amit

答えて

2

次のいずれかの

NodePtr bestChild, otherChild; 
if (diff < 0) 
{ 
    bestChild = node->child1; 
    otherChild = node->child2; 
} 
else 
{ 
    bestChild = node->child2; 
    otherChild = node->child1; 
} 

または

NodePtr children[2] = (diff < 0) ? {node->child1, node->child2} : {node->child2, node->child1}; 

か、単にコンパイラは、おそらくあなたのためにこれを行いますので、それがあるとしてそれを残します。

関連する問題