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)。これをさらに最適化できますか?