1

私は、JavaScriptがそれらに遭遇したときに同じ式を(再び)計算するかどうか疑問に思っていました:

例えば ​​:

alert(new Date().getTime()+1-1+1-1+1-1+1-1+1-1+1-1+1-1+1-1+1-1+1-1-new Date().getTime())

output : 0

そのようにテストするのは難しいですが、すべてに時間がかかると思った+/-1ので(ティック)、違いを見ることができました。

しかし、答えは 0 です。

そう 、

速すぎるため、またはJSが最初の new Date() を後のものと同じように扱うため、ゼロですか?

4

4 に答える 4

6

GetTime()Unix エポックからのミリ秒数を返します。理論的には、最新のプロセッサー (数十億 FLOPS で実行される) で加算に 1 つの FLOP しかかからないことを考えると、プロセッサーが単純にステートメント全体を 1 ミリ秒未満で実行する可能性が非常に高いと言えます。

もちろん、これを実際にテストする方法は、このループを何十億回も実行し、残りを大数の法則に任せることです。さらに簡単にするために、乗算と除算を任意に大きな数で交互に使用して、実行時間を長くすることもできます。

いずれにせよ、一般的に、言語は常に、またはほとんどの場合そうすることが理にかなっていない限り、関数を最適化する傾向がないことに注意してください。あなたの特定のケースでは、計算にかかる時間を測定しようとしていないとプログラムが合理的に想定できるでしょうか? 1 行のステートメントを複数の小さなステートメントに分解するとどうなるでしょうか。あなたはまったく同じことをしているでしょう...この場合、日付/時刻関数が異なる動作をするのは合理的でしょうか?

要するに、日付/時刻をキャッシュすると、プログラムの実行に重大な問題が発生する多くのケースが考えられます。キャッシングによって提供される非常に小さなパフォーマンスの向上がそれらを補うとは想像できません。

于 2013-05-26T10:55:06.213 に答える
2

はい、10 回の+操作と 10 回-の操作では、おそらく 1 ミリ秒もかかりません。次のようにテストできます。

var c = (new Date().getTime() + calc() - new Date().getTime());

function calc() {
    for (var i = 0; i < 100000000; i++) {}
    return 0;
}

console.log(c);

そして、実際にはゼロに等しくない出力が得られます。

于 2013-05-26T10:57:02.663 に答える
1

それは JavaScript エンジンに依存します。コードがプリコンパイルされている場合、+/- 1 の計算が最適化されて除去される可能性があります。

于 2013-05-26T10:55:28.100 に答える