2

ほとんどの場合、べき乗はO(log n)以下であることは知っていますが、数値がどのように表されるかを理解しようとすると迷子になります。たとえば、JavaScriptにはいくつかのネイティブの数値形式があるため、次のようになります。

100000 === 1E5 && 100000 === 0303240
>>> true

内部的には、それらはすべて、メモリに格納されたバイナリ値として格納および操作されることになりませんか?もしそうなら、マシンは8進数と同じくらい速く10進数と科学的記数法の表現を保存することができますか?

+("1E" + n)したがって、あなたはより速いと期待しますMath.pow(10, n)か?

ほとんどの場合、この質問は1E(n)がどのように機能するかについてですが、自分で答えを考えようとすると、最初に数値がどのように解析されて保存されるかについてもっと興味がありました。説明をいただければ幸いです。

4

4 に答える 4

3

Math.pow少なくとも連結によって新しいオブジェクトが作成され(メモリ割り当て、GCのジョブが増える)、通常は単一のマシン命令になるため、文字列操作が高速になるとは思いません。

さらに、一部の最新の JS VM はホットスポットの最適化を行い、javascript からマシン コードを生成します。なら可能性はあるがMath.pow、弦魔法ならほぼ無理。

アプリケーションでの動作が遅いと 100% 確信している場合Math.pow(信じられません)、配列ルックアップを使用できます。可能な限り高速に動作するはずです[1,10,100,1000,10000,...][n]。配列は比較的小さく、複雑さはO(1).

于 2011-12-29T14:24:02.360 に答える
1

オプションでjsperfを実行しました。

var sum = 0;
for (var i = 1; i < 20; ++i){
  sum += +("1E" + i);
}

文字列連結のために遅いです。

var sum = 0;
for (var i = 0; i < 20; ++i){
  Math.pow(10, i);
}

したがって、数値のみを操作するため、高速です。

var sum = 0;
sum += 1e0;
sum += 1e1;
...
sum += 1e19;

1ex最速ですが、定数は事前に計算された値であるため、可能性が高いだけです。

最高のパフォーマンスを得るには、自分で答えを事前計算することをお勧めします。

于 2011-12-29T14:30:30.263 に答える
1

しかし、数字自体がどのように表されているかを理解しようとして迷っています。JavaScript を例にとると、ネイティブの数値形式がいくつかあるためです。

内部的には、それらはすべてメモリに格納されたバイナリ値として格納および操作されてしまうのではないでしょうか?

はい、JavaScriptでは、64ビット浮動小数点型の数値型が1つしかないため、

1 === 1.0 

http://www.hunlock.com/blogs/The_Complete_Javascript_Number_Reference

もしそうなら、マシンは 8 進数と同じくらい速く 10 進数と科学表記法を格納できますか?

はい、1 種類しかないためです。(1分程度の差はあるかもしれませんが無視できる程度です)

ただし、この特定のケースでは、表現できる数が ~ 1e300 に制限されているため、実行時間は O(~300) = O(1) であり、他のすべての数値は +/- Infinity として表されます。

したがって、 +("1E" + n) は Math.pow(10, n) よりも高速であると期待できますか?

そうではありません!1E100 は Math.pow(10,n) よりも高速ですが、 +("1E"+n) は Math.pow(10,n); よりも低速です。文字列とメモリの割り当てのためではなく、JS インタープリターが文字列を解析して数値に変換する必要があり、ネイティブの Math.pow(num,num) 操作よりも遅いためです。

jsperf テスト

于 2011-12-29T18:37:48.170 に答える
0

Math.pow は数値を区別しないため、インタープリターが整数を最適化しない限り、すべての数値で同じように遅くなります。少数のフロートを実行に割り当てる可能性があります。解析時間を無視しています。

"1E"+n は、2~3 個の文字列オブジェクトを割り当てますが、これにはかなりのメモリ オーバーヘッドがあり、中間体を破棄し、数値として再解析します。パウより速いとは思えない。私は再び解析時間を無視しています。

于 2011-12-29T14:25:26.413 に答える