2

頻繁に実行されるコードがあり、これを最適化したいと考えています。次のようになります。

int exponent;
uint32_t mantissa;

if (exponent < 0) {
    return mantissa << -exponent;
} else {
    return mantissa >> exponent;
}

その目的は非常に明確です。負になる可能性がある場所で右シフトmantissaする必要があります。exponentexponent

これをコーディングするより高速な方法はありますか (可能であればブランチなしで)。

4

2 に答える 2

4

確かにあります。つまり、ブランチのないものです。すべての状況で必ずしも高速であるとは言えません。

int exponent;
uint32_t mantissa;

return (uint32_t)( (uint64_t)mantissa << (32-exponent) >> 32 );
于 2012-04-22T21:42:50.140 に答える
0

この「integer abs without branching」を見てください。この男は、あなたが望むものを含む素晴らしいビットトリックのセットを持っています. あなたの場合、「指数」変数の型が決して変わらない場合、「sizeof(int)*CHAR_BIT」を8に置き換える必要があるようです。

ところで、この特定の 'if' ステートメントが分岐によるパフォーマンスの問題であると確信していますか? 私が言いたいのは、問題がデータのローカリティがどこかにある場合、ブランチを最適化しても意味がないということです。

于 2012-04-23T08:35:02.890 に答える