工作中遇到一个问题,对于一个N>100000的数组,求取数组元素i到j范围内的和。想到了两个方法代码如下:
//生成数组
var arr = [];
for(var i = 1; i <= 10000000; i++) {
arr.push(i);
}
//方法1,使用reduce求和
function sumRange(arr, start, stop) {
var tmpArr = arr.slice(start, stop);
var result = tmpArr.reduce(function(a, b) {
return a + b;
});
return result;
}
//方法2,使用for求和
function sumRangeOrgin(arr, start, stop) {
var result = 0;
for(var i = start; i < stop; i++) {
result += arr[i];
}
return result;
}
sumRange.name="sumRange";//IE 浏览器function 没有name属性,保证一致,统一赋值
sumRangeOrgin.name="sumRangeOrgin";
//代码测试方法
function proferences(len,arr, fn1, fn2) {
var sumTime1 = 0,sumTime2 = 0;
for(var i = 0; i < len; i++) {
var s = parseInt(Math.random() * 100000);//模拟随机性
var e = parseInt(Math.random() * 100000);
if(s > e) {//如果开始索引大于结束索引则交换两个变量
s = (e ^= s ^= e) ^ s; //交换两个变量值
}
start = Date.now();
fn1(arr, s, e);
end = Date.now();
sumTime1 += (end - start);
start = Date.now();
fn2(arr, s, e);
end = Date.now();
sumTime2 += (end - start);
}
console.log(fn1.name+":"+(sumTime1 / len).toString() + "," +fn2.name+":"+ (sumTime2 / len).toString());
}
//多执行几次
proferences(10000,arr, sumRangeOrgin, sumRange);
proferences(10000,arr, sumRange, sumRangeOrgin);
测试结果如下(chrome测试):
sumRangeOrgin:0.0299,sumRange:0.577
sumRange:0.587,sumRangeOrgin:0.0273
(火狐测试):
sumRangeOrgin:0.0311,sumRange:0.1966
sumRange:0.2006,sumRangeOrgin:0.0278
(IE测试)
sumRangeOrgin:0.488,sumRange:1.971
sumRange:1.993,sumRangeOrgin:0.4942
显然,使用for循环更快,而且对于这种数据求和处理速度 火狐与chrome相当。IE最low