4

f任意の引数で呼び出すことができる関数があります。2 つの引数で呼び出されると、操作を実行します。2 つ以上の引数で呼び出された場合、それ自体が他の引数を折りたたむ必要があります。つまり、 を呼び出すf(a,b,c,d)と、関数は のように再配置する必要がありf(f(f(a,b),c,d)ます。これを可能な限り最適化する必要があります。私は2つのソリューションを提供し、それらをベンチマークしました:

alphabet = 'abcdefhijklmnopqrstuvwxyz'.split('');
var last_mark;
benchmark = function(msg){ 
  alert(msg.replace('$TIMEDIFF',Date.now()-last_mark)); 
  last_mark=Date.now(); 
};
fa = function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z){
    if (c) return fa(fa(a,b),c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z);
    return a+b;
};
fb = function(a,b,rest){
    if (rest) return fb.apply(this,[fb(a,b)].concat(Array.prototype.slice.call(arguments,2)));
    return a+b;
};
benchmark("Starting benchmark:");
for (var i=0; i<100000; ++i) fa.apply(this,alphabet);
benchmark("Function 1: $TIMEDIFF");
for (var i=0; i<100000; ++i) fb.apply(this,alphabet);
benchmark("Function 2: $TIMEDIFF");

最初のソリューションはより高速でした (node.js で 200ms 対 4000ms)。これをさらに最適化できますか?

4

4 に答える 4

2

ES5 では、まさに.reduce()そのタスクのための関数が導入されました。最初の 2 つの項目に対して何らかの関数を呼び出し、最初の呼び出しの戻り値と 3 番目の項目を渡して再度呼び出し、その呼び出しの戻り値4 番目の項目を渡して再度呼び出す、というように続きます。

var f = function () {
    return toArray( arguments ).reduce(function ( a, b ) {
        return a + b;    
    });
};

ライブデモ: http://jsfiddle.net/hpAtB/1/

于 2012-11-18T22:02:53.157 に答える
1

オブジェクトを引数として使用しないのはなぜですか?

var o = {
  a:value1,
  b:value2,
  ...
  z:value26
};

fa(o);

function fa(obj){
  if(obj.c){  // or any other logic
    return fa(obj);
  }
  return o;
}

またはグローバル変数 (引数なし)

fa();

function fa(){
  if(o.c){  // or any other logic
    o.c = o.d + o.e;
    fa();
  }
}
于 2012-11-18T21:29:31.007 に答える
1

最速の方法は、再帰を反復に置き換えるようです。

高階関数を定義するfolder

var folder = function(func) {
   return function() {
            var args = Array.prototype.slice.call(arguments), len = args.length, result = args[0], i = 1;
            for(; i < len; i++){
               result = func.call(this, result, args[i]); 
            }

           return result;
   };
};

このパフォーマンス テストを確認してください: http://jsperf.com/varargs-fold

于 2012-11-18T21:53:41.223 に答える