数组求和的多种方法,并比较性能
Posted faithMeng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组求和的多种方法,并比较性能相关的知识,希望对你有一定的参考价值。
可以借用下面12种方法对数组求和,创建一个长度为10w的数组,进行测试
- every()????? 检测数值元素的每个元素是否都符合条件。
- filter()??????检测数值元素,并返回符合条件所有元素的数组。
- map()?? ?? ? 通过指定函数处理数组的每个元素,并返回处理后的数组。
- some()????? 用于检测数组中的元素是否满足指定条件(函数提供)。
- reduce()???? 数组中的每个值(从左到右)开始合并,最终为一个值
- reduceRight()?? 数组中的每个值(从右到左)开始合并,最终为一个值
- eval() ????? 计算 JavaScript 字符串,并把它作为脚本代码来执行。
- for????? 循环代码块一定的次数
- while????? 当指定的条件为 true 时循环指定的代码块
- do/while ???? 同样当指定的条件为 true 时循环指定的代码块
- for in????? 循环遍历对象的属性
- forEach????? 调用数组中的每个元素。
具体实现:
首先创建一个庞大的数组:
var aArr = [];
for(var i = 0;i < 1000000;i++){
aArr.push(i);
}
(function(){ //every var _sum = 0; console.time(‘every求和时间‘); aArr.every(function(item,index){ _sum += item; return true;//every每个值都运行 }) console.log(‘every求和: ‘+_sum); console.timeEnd(‘every求和时间‘); //filter var _sum = 0; console.time(‘filter求和时间‘); aArr.filter(function(item,index){ _sum += item; }) console.log(‘filter求和: ‘+_sum); console.timeEnd(‘filter求和时间‘); //map var _sum = 0; console.time(‘map求和时间‘); aArr.map(function(item,index){ _sum += item; }) console.log(‘map求和: ‘+_sum); console.timeEnd(‘map求和时间‘); //some var _sum = 0; console.time(‘some求和时间‘); aArr.some(function(item,index){ _sum += item; }) console.log(‘some求和: ‘+_sum); console.timeEnd(‘some求和时间‘); //reduce console.time(‘reduce求和时间‘); var prev; aArr.reduce(function(prev,item,index){ prev += item; }) console.log(‘reduce求和: ‘+_sum); console.timeEnd(‘reduce求和时间‘); //reduceRight console.time(‘reduceRight求和时间‘); var next; aArr.reduceRight(function(next,item,index){ prev += item; }) console.log(‘reduceRight求和: ‘+_sum); console.timeEnd(‘reduceRight求和时间‘); //eval console.time(‘eval求和时间‘); var _sum = eval(aArr.join(‘+‘)); console.log(‘eval求和: ‘+_sum); console.timeEnd(‘eval求和时间‘); //for console.time(‘for(var i = 0,len = aArr.length;i < len;i++)求和时间‘); var _sum = 0; for(var i = 0,len = aArr.length;i < len;i++){ _sum += i; } console.log(‘for求和: ‘+_sum); console.timeEnd(‘for(var i = 0,len = aArr.length;i < len;i++)求和时间‘); console.time(‘for(var i = 0;i < aArr.length;i++)求和时间‘); var _sum = 0; for(var i = 0;i < aArr.length;i++){ _sum += i; } console.log(‘for求和: ‘+_sum); console.timeEnd(‘for(var i = 0;i < aArr.length;i++)求和时间‘); //while console.time(‘while求和时间‘); var _sum = 0,i = 0,_len = aArr.length; while(i < _len){ _sum += aArr[i]; i++; } console.log(‘while求和: ‘+_sum); console.timeEnd(‘while求和时间‘); //do while console.time(‘do while求和时间‘); var _sum = 0,i = 0,_len = aArr.length; do{ _sum += aArr[i]; i++; }while(i < _len) console.log(‘do while求和: ‘+_sum); console.timeEnd(‘do while求和时间‘); //forEach var _sum = 0; console.time(‘forEach求和时间‘); aArr.forEach(function(item,index){ _sum += item; return true;//every每个值都运行 }) console.log(‘forEach求和: ‘+_sum); console.timeEnd(‘forEach求和时间‘); })() every求和: 4999950000 every求和时间: 5.648193359375ms filter求和: 4999950000 filter求和时间: 3.9560546875ms map求和: 4999950000 map求和时间: 17.988037109375ms some求和: 4999950000 some求和时间: 6.005126953125ms reduce求和: 4999950000 reduce求和时间: 5.129150390625ms reduceRight求和: 4999950000 reduceRight求和时间: 4.081787109375ms eval求和: 4999950000 eval求和时间: 43.47314453125ms
for求和: 4999950000 for(var i = 0,len = aArr.length;i < len;i++)求和时间: 2.748046875ms
for求和: 4999950000 for(var i = 0;i < aArr.length;i++)求和时间: 5.08984375ms
while求和: 4999950000 while求和时间: 4.9140625ms do while求和: 4999950000 do while求和时间: 4.52392578125ms forEach求和: 4999950000 forEach求和时间: 4.5830078125ms
效率最快的也就是我们用的较多的for循环(红字),但是如果不注意for的优化写法,就会导致for性能的极大降低
以上是关于数组求和的多种方法,并比较性能的主要内容,如果未能解决你的问题,请参考以下文章
如何通过在 swift playground 中传递 Int 数组来创建求和函数并调用它?