4

Typescript の省略記号argumentsは、関数の先頭から配列を構築する JavaScript を生成します。

function blah(...args: any[]){
}

になります:

function blah() {
    var args = [];
    for (var _i = 0; _i < (arguments.length - 0); _i++) {
        args[_i] = arguments[_i + 0];
    }
}

パフォーマンスを念頭に置いて私のプロジェクトを見てみると、この構造が頻繁に呼び出されるコードのパフォーマンス上の問題になるかどうか疑問に思っていますか?

それは...ですか?

4

3 に答える 3

1

私はジェフリーの答えに同意しますが、ポイントが見落とされていると思います.

残りのパラメーターがパフォーマンスの低下を引き起こすかどうかを尋ねますが、何と比較しますか?

たとえば、次の関数があるとします。

var addNums = function(...nums: number[]) {
    var result = 0;
    for (var i = 0; i < nums.length; i++) {
        result += nums[i];
    }
    return result;
};

どのような代替手段を使用できますか?

残りのパラメーターを回避したい場合は、数値がいくつあるかわからなくても、おそらく配列引数を受け入れるでしょう。これら 2 つのシナリオでは、実行時のパフォーマンスは似ています。したがって、残りのパラメーターは、呼び出し元のコードにとって便利なだけです。

addNums(1,1,2,3);

それよりも

addNums([1,1,2,3]);

TypeScript に独自の関数本体を持つメソッド オーバーロードがある場合、C# フレームワーク クラス ライブラリで使用されているのと同じトリックを実行できます。これにより、一連のオーバーロードに固定メソッドを提供し、残りのパラメーターを使用して、より多くの数のケースを処理します。引数 - たとえば、次のようなメソッド シグネチャがあります。

addNums(a: number, b: number)
addNums(a: number, b: number, c: number)
addNums(...nums: number[])

したがって、一般的なケースでは、非ループ バージョンが呼び出されますが、エッジ ケースではパフォーマンスの低いバージョンが実行されます。

TypeScript でこれを試すこともできますが、すべてのオーバーロードに対して単一の互換性のあるメソッド本体を提供してから、高速になる可能性が低い引数を確認する必要があります (ただし、測定することはできます)。

したがって、このメソッドを何千回も呼び出さない限り、別の方法よりも悪いことはまずありません。

于 2013-07-27T19:18:47.767 に答える
0

私のログ関数はそれらを使用し、頻繁に呼び出されるので、私も興味がありました。

テストしました

function toArray(obj, start)
{
  var arr=[];
  for (var i=start||0, j=0, len=obj.length; i<len; ++i)
      arr[j++]=obj[i];
  return arr;
}

function toArrayPush(obj, start)
{
  var arr=[];
  for (var i=start||0, len=obj.length; i<len; ++i)
      arr.push(obj[i]);
  return arr;
}

function testArgToArrayPush(level)
{
  var args=toArrayPush(arguments, 1);
}

function testArgToArray(level)
{
  var args=toArray(arguments, 1);
}

function testArgTypescript(level)
{
  var args = [];
  for (var _i = 0; _i < (arguments.length - 1); _i++)
      args[_i] = arguments[_i + 1];
}

function testArgSlice(level)
{
  var args=Array.prototype.slice.call(arguments, 1);
}

優れたbenchmarkjs.comを使用したnode.js v0.10.18:

testArgToArrayPush x 4,505,312 ops/sec ±0.55% (64 runs sampled)
testArgToArray x 2,961,857 ops/sec ±2.37% (93 runs sampled)
testArgTypescript x 3,879,242 ops/sec ±1.15% (96 runs sampled)
testArgSlice x 1,060,084 ops/sec ±0.52% (95 runs sampled)
Fastest is testArgToArrayPush

つまり

  • ほとんどの場合、Typescript バージョンで十分です
  • ホットスポットがある場合は、toArrayPush() の使用を検討してください。
  • Array.prototype.slice() を避ける
于 2013-09-19T09:03:16.037 に答える