私は下限と上限で得られた範囲に対して複数の数値(3つ以上)をテストしています(lower <= upper
の条件がいつも満足している)。今ここに私の目的は、私は、パフォーマンスを最適化したいと思います 下[1 ... n]を持つ、X [1 ... n]と上位[1 ... n]は条件で複数のa <= b <= cをテストする最も効率的な方法
...
私はthis other Q&A here on StackOverflowを見ていた後、私はこの機会にJavaScriptで行く必要がある、と私は「古典」lower[n] <= x[n] && x[n] <= upper[n]
上
(unsigned)(x[n]-lower[n]) <= (upper[n]-lower[n])
フォーム
で行くことができる、知っています私はそれを得ることができることを知っているこの言語は使用して「トリック」:
または私は第二の方法は非常にパフォーマンス上の最悪の影響を与えるだろう、かなり確信しているJavaScript Uint32Array object
を使用することによって、除きます出発時に、最初のものだけを考えれば、私はできます:
// Example 1
function everything_is_in_range(lower, x, upper) {
return (((x[0]-lower[0]) >>> 0) <= (upper[0]-lower[0]) &&
((x[1]-lower[1]) >>> 0) <= (upper[1]-lower[1]) &&
...
((x[n-1]-lower[n-1]) >>> 0) <= (upper[n-1]-lower[n-1]));
}
私は何ができる
または:
// Example 2
function everything_is_in_range(lower, x, upper) {
if (((x[0]-lower[0]) >>> 0) > (upper[0]-lower[0])) return false;
if (((x[1]-lower[1]) >>> 0) > (upper[1]-lower[1])) return false;
...
return (((x[n-1]-lower[n-1]) >>> 0) <= (upper[n-1]-lower[n-1]));
}
私の質問は以下のとおりです。私は目的のために、「古典的」lower[n] <= x[n] && x[n] <= upper[n]
フォームに滞在する必要がありますように
符号なしシフトは、一般的なパフォーマンスに便利ではないでしょう?
私の最初の答えに対する答えがいいえでない場合、どちらの方法が最も効率的でしょうか?しかし、もっと重要なこと:あなたがおそらくあなたが提案できるより良いものを知っていますか?
P.S.私は次のようにforループを行うことができます知っている:
// Loop example
function everything_is_in_range(lower, x, upper) {
for (i=0; i<n; ++i) if (((x[i]-lower[i]) >>> 0) > (upper[i]-lower[i])) return false;
return true;
}
しかし
それは私が少ないコードを書くせるためだけ便利だろうが、それは2番目のコードのアプローチに非常にアナログなものです結局、いいえ?
すべての値が単一の区切りパラメータとして渡される可能性があるため、このフォームを使用したくない(これは私の実際のケースで、3または4の数値+範囲の変数セットこれを変更することはできません)、値の配列としては使用できません(この例のように)。
Javascriptには符号なし数値の概念がないため、その特定のトリックを利用することはできません – Hamms
'function withinRange(num、begin、end){if(num> = begin && num <= end){trueを返します。 } else {return false; }} ' – PHPglue
を" unsigned "にすると、追加の変換ステップのために少し遅くなる可能性が高くなります。https://stackoverflow.com/questions/14890994/javascript-c-style-type-cast-from-signed-私の推測では、関数呼び出し自体が比較よりも大きなオーバーヘッドを持つことになります。 – Slai