「それ以上」対「より大きいまたは等しい」速度
-
28-10-2019 - |
質問
誰かがそれらの正確な速度テストの1つを知っているか、持っているのか、ActionScript 3の速度以上の「ゼロ」以上の「「対」以上の」をテストできるのではないかと思っていました(それが違いを生む場合はAir 2.5)?
このコンピューターで実行されている仮想マシンがあり、非常に不正確な結果が得られています。
そのようにそれを使用します
if ( !(__index < _vector.length) ) return;
また
if ( __index >= _vector.length ) return;
最初のものは1つのテストであり、それを逆にすることだと思っていたでしょうが、ActionScript 3には、あなたが決して確信できない癖がいくつかあります。
解決
理論的には、速度に違いはないはずです。 ActionScriptはNanojit JITライブラリを使用してコードをコンパイルします。私は事実を知っています(AdobeのActionScriptとNanojitを共有するMozillaのJavaScriptエンジンでそのコードに取り組んだことがあります)逆の比較に。したがって、理論的には、唯一の違いは、コードをコンパイルするために別のサイクルまたは2つの費用を費やすことです。これは心配する価値がありません。
一方、現代のCPUは複雑な獣であり、無限の摂動は顕著な違いを生む可能性があります。ですから、私は2つの間に違いがないことに強いオッズを置いていましたが、私はその農場に賭けませんでした。
他のヒント
あなたの質問は、ほとんどの言語が可能な限り最も最適なマシンコードにコンパイルしようとするため、アクションスクリプトよりもコンピューターサイエンスに関係しています。
そのため、C ++の例を使用して質問に答えます。
int j = 16;
if (!(j < 10))
{
int l = 3;
}
if (j >= 10)
{
int l = 3;
}
これにより、アセンブリで次の重要なセクションが生成されます。
00231375 cmp dword ptr [j],0Ah
00231379 jl wmain+32h (231382h)
0023137B mov dword ptr [l],3
00231382 cmp dword ptr [j],0Ah
00231386 jl wmain+3Fh (23138Fh)
00231388 mov dword ptr [l],3
0023138F xor eax,eax
行00231375および00231382は、IFステートメントに含まれる実際のテストです。ご覧のとおり、私の<と> =テストの両方が、アセンブリで同じコードとしてコンパイルされました(2つの整数を比較する場合)。したがって、どちらのテストもCPUで同じ時間がかかります。どちらも同じテストになるためです(右<右に、ブロックの場合はスキップ)。これは、アクションスクリプトコンパイラに当てはまる可能性が高いです。
ただし、1つの質問は、JITコンパイラがコンパイルに時間がかかるかどうかです!([int] <[int])または[int]> = [int]。私の推測では、違いはおそらく重要ではないということです。
ループを作成し、GetTimer()を使用して発見します。このようなことを試してみてください:
var startTime:int = getTimer()
var count:int = 1000000
for (var i:int = 0;i<count;i++) {
if ( !(__index < _vector.length) ){
}
}
trace("The first script took "+String(getTimer()-startTime) + "ms to run")
startTime = getTimer()
for (i = 0;i<count;i++) {
if ( __index <= _vector.length ){
}
}
trace("The second script took "+String(getTimer()-startTime) + "ms to run")
また、このtecniqueで不正確な結果が得られる場合は、カウント変数を大きくしてみてください。 「_vector.lenght」の削除ループからの検証は、「>」と「> =」パフォーマンスを確認する必要がある場合に役立つ場合があります