9

「非常によく」問題を解決するアルゴリズムがいくつかあります。「非常によく」とは、整数演算を優先して浮動小数点演算の量を最小限に抑えることを意味するという仮定の下にあります。たとえば、キャンバスに線を描くためにどのピクセルを塗りつぶすかを判断するための Bresenham の線アルゴリズムを考えてみましょう。この男は、単純な整数演算だけでプロセス全体を実質的に実行可能にしました。

この種のことは、多くの状況で明らかに優れています。しかし、JavaScript で多くの浮動小数点演算を必要とする操作について心配する価値はありますか? 言語仕様に関する限り、すべてがほとんど10進数であることを理解しています。物事を可能な限り整数のように保つことが実際に価値があるかどうか疑問に思っています.ブラウザは価値のある最適化を行いますか?

4

3 に答える 3

15

JavaScript で Int8、Uint8、Int16 などを使用できますが、通常よりも少し手間がかかります - TypedArraysを参照してください。

var A = new Uint32Array(new ArrayBuffer(4*n));
var B = new Uint32Array(new ArrayBuffer(4*n));

//assign some example values to A
for(var i=0;i<n;i++)
  A[i] = i; //note RHS is implicitly converted to uint32

//assign some example values to B
for(var i=0;i<n;i++)
  B[i] = 4*i+3;  //again, note RHS is implicitly converted to uint32   

//this is true integer arithmetic
for(var i=0;i<n;i++)
  A[i] += B[i]; 

最近、asm.jsプロジェクトにより、C/C++ コードを、かなり極端な方法でこれらの TypedArrays を使用する奇妙に見える JavaScript にコンパイルできるようになりました。利点は、既存の C/C++ コードを使用でき、かなり実行されるはずです。ブラウザーでの高速化 (特に、ブラウザー ベンダーがこの種のコードに対して特別な最適化を実装している場合、これは間もなく実現する予定です)。

余談ですが、プログラムで SIMD 並列処理を実行できる場合 (wikipeda を参照)、つまり、コードで SSEx 命令セットを使用している場合、算術演算ははるかに高速になり、実際に int8 を使用すると int16 を使用した場合の 2 倍の速度になります。

*私は、ブラウザーがその場で利用するには難しすぎるため、これはまだブラウザーには関係ないと思います。編集: Firefox がこの種の最適化を実験していることが判明しました。また、Dart (真の Dart、js にコンパイルされた Dart ではありません) は、Chrome でこれを行うことができます。

于 2013-05-26T21:43:45.780 に答える
4

はるか昔、コンピューターには専用の FPU がなく、浮動小数点演算はすべてソフトウェア エミュレーションによって行われていました。

最新のコンピューターにはすべて、整数だけでなく浮動小数点演算も処理する専用の FPU があります。特別な事情がない限り、気にする必要はありません。

于 2012-12-29T04:29:31.643 に答える
-5

実際、違いはありません。JavaScript には「整数」という概念がありません。JS は倍精度浮動小数点数のみを使用します。これは整数である場合とそうでない場合があります。

したがって、整数に制限しても、パフォーマンスの点で得られるものはまったくありません。

ただし、整数は 2 51まで正確であることに注意してください。一方、非整数は精度の低下 (例: 0.1) を非常に簡単に被る可能性があるため、これにより利益が得られる可能性があります。

于 2012-12-29T04:28:37.917 に答える