我有一个函数f
,可以用任意参数调用。当使用2个参数调用它时,它会执行操作。当使用>2个参数调用它时,它必须自己折叠其他参数。也就是说,当我们调用f(a,b,c,d)
时,函数应该重新排列为f(f(f(a,b),c,d)
。我需要这个尽可能优化。我提供了两种解决方案并对它们进行了基准测试:
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上为200毫秒,而不是4000毫秒)。这个可以进一步优化吗?
fa
不能接受无限数量的参数。fb
需要更多时间,因为它在分配数组,但如果你想要一个可变函数,它似乎是必要的。 - Felix Kling