16

私は非常にJavaScriptが重い(ほとんどすべてのJavaScriptである)アプリケーションを作成しており、反復処理するデータがかなりあり(JSON)、これを使用して特定のタスクを計算する必要があります。パフォーマンスは、アプリケーションの主要な考慮事項です。私はこれを支援するためにWebworkersを紹介しましたが、jQueryのような(ループ.each()の代わりに)libsによって提供されるメソッドに頼らないようにしています。forとにかく、ここに簡単な質問があります...

アプリケーション内で、分割を含む多くの数値プロセスを含む価格変更を適用する必要があります。これが何千回も起こることを念頭に置いて、乗算または乗算と除算の混合によって常に変更を適用する方が良いでしょう。たとえば、0.5を掛けたり、2で割ったりすることで、50%の割引を適用できます。

除算は乗算よりも遅いといつも教えられていましたが、これを実際に証明するものはありません…ベンチマークとテストの実行を開始する前に、誰かがこれについて意見を持っていますか?

4

3 に答える 3

66

どちらの操作も非常に高速ですが、乗算は除算よりもわずかに優れたパフォーマンスを発揮します。私のテスト(下記)では、Chromeで14%の違い、IE 9で10%の違いに気づきました。ブラウザーからそのパフォーマンスを引き出す必要がある場合は、ループに入る前に分周器を乗数に変換できますが、私はしませんこのような小さな改善のために読みやすさを妥協するのは良い考えだと思います。

var cnt = 500000;
var rls = []
var ags = [[2,1], [4,2], [7,3], [4e0,1], [32e0,2], [37e0,3], [-37e7,(7e3/3e-4)]];
var fns = [
  {name: "fn_mul", fn: (function(x, y) { return x * y; })},
  {name: "fn_div", fn: (function(x, y) { return x / y; })}
]

// setup  ---------------------------------------
for(var iag=0; iag<ags.length; iag++) {
  if(Object.prototype.toString.call(ags[iag]) !== "[object Array]") {
    ags[iag] = [ags[iag]]
  };
}

// run ------------------------------------------
for(var ifn=0; ifn<fns.length; ifn++) {
  var fn = fns[ifn].fn;
  var ts = (new Date()).valueOf();
  for(var iag=0; iag<ags.length; iag++) {
    var ag = ags[iag];
    for(var icn=0; icn<cnt; icn++) { fn.apply(this, ag); }
  }
  rls.push({"name": fns[ifn].name, "ts": (new Date()).valueOf() - ts});
}
dump(rls);
于 2012-05-10T14:47:59.993 に答える
8

これにもう少しコンテキストを追加するために、コンパイラが除算を乗算に最適化しない場合(たとえばn / 2、に変換されるn * 0.5場合)、乗算は常に除算よりも高速になります。

これは、これらの操作がCPUによってどのように実行されるかによるものです。

x86の参照については、 https ://stackoverflow.com/a/1148060/520857を参照してください(スポイラー:fmulは2〜3倍高速ですfdiv

AMDへの参照についてはhttps://stackoverflow.com/a/17883319/520857を参照してください(スポイラー:より7fmul倍速いfdiv

これらの操作の速度は速すぎて多くのIRLを問題にすることはできませんが、多くの操作を行っていて、コンパイラが乗算に変換されていないことがわかった場合(javascriptエンジンがこれを行うとは思わないので、引用しないでください)ただし、グーグルで簡単にチェックしてもトピックに関する情報は得られませんでした)。分割が遅すぎるためにパフォーマンスのボトルネックが発生した場合は、この最適化を行うのが理にかなっています。ほとんどすべてのアプリケーションで、CPUバウンドよりもI/Oバウンドである可能性があります。

編集:多くの浮動小数点計算を実行している場合は、GPUを使用してそれらの操作を実行する方法を見つけることを検討できます。GPUはCPUよりもFP opsで大幅に高速であるため、もう一度グーグル検索を開始します。http ://gpu.rocks/

于 2018-09-17T17:13:19.267 に答える
0

個人的には、パフォーマンスの面で大きな違いはないと思います。これを検討している場合は、マイクロレベルに到達しています。

コードの可読性は、このようなマイクロ最適化よりもはるかに重要です。読みやすさと理解を容易にするためのコード。どうしてもマイクロ最適化する必要がある場合は、後で実際のボトルネックを見つけたときにそれを実行してください。

于 2012-05-10T14:03:36.410 に答える