【JS】FOR循环通关只循环一次length提高性能
问题来源于jqueryAPI
原文:
Iteration
An array has a length property that is useful for iteration:
for ( var i = 0; i < a.length; i++ ) {
// Do something with a[i]
}
When performance is critical, reading the length property only once can help to speed things up.
This should be used only when a performance bottleneck was discovered:
for ( var i = 0, j = a.length; i < j; i++ ) {
// Do something with a[i]
}
Another variation defines a variable that is filled for each iteration, removing the array-notation from the loop-body. It does not work when the array contains 0 or empty strings!
for ( var i = 0, item; item = a[i]; i++ ) {
// Do something with item
}
总共有三种循环写法,分别于chrome下累加测试:
<button onclick="test1()">开始计时1</button>
<button onclick="test2()">开始计时2</button>
<button onclick="test3()">开始计时3</button>
<script>
var a=[],date1,date2,date;
for(var i= 0;i<100000000;i++){
a.push(parseInt(Math.random()*10000000)+1);
}
console.log(a.length);
function test1() {
date1=new Date().getTime(); for(var i= 0,sum=0;i<a.length;i++){
sum+=a[i]
} date2=new Date().getTime();
date=date2-date1;
console.log("第一种方法"+date+"毫秒"+sum);
}
function test2() {
date1=new Date().getTime(); for(var i= 0,sum=0,item1=a.length;i<item1;i++){
sum+=a[i]
} date2=new Date().getTime();
date=date2-date1;
console.log("第二种方法"+date+"毫秒"+sum);
}
function test3() {
date1=new Date().getTime(); for(var i= 0,sum=0,item2;item2=a[i];i++){
sum+=item2;
} date2=new Date().getTime();
date=date2-date1;
console.log("第三种方法"+date+"毫秒"+sum);
} </script>
控制台输出结果:
第一种方法401毫秒499988949879357
第二种方法386毫秒499988949879357
第三种方法387毫秒499988949879357 第一种方法391毫秒499988949879357
第二种方法386毫秒499988949879357
第三种方法387毫秒499988949879357 第一种方法417毫秒499988949879357
第二种方法390毫秒499988949879357
第三种方法394毫秒499988949879357
后两种方法速度略快,应该是省了length获取时间;
如果把第一种i++变成i--,循环体反过来写,是不是能达到类似的效果,测试代码:
第一种方法400毫秒499988167511348
第二种方法394毫秒499988167511348
第三种方法398毫秒499988167511348
第四种方法416毫秒499988167511348 第一种方法402毫秒499988167511348
第二种方法397毫秒499988167511348
第三种方法411毫秒499988167511348
第四种方法401毫秒499988167511348 第一种方法394毫秒499988167511348
第二种方法392毫秒499988167511348
第三种方法390毫秒499988167511348
第四种方法400毫秒499988167511348
测试结果甚至与前一次测试发生了冲突,尝试扩大样本内容/循环体复杂化,提高误差,然而chrome崩溃了。
这次测试也不是毫无结果,至少如jqueryAPI原文说的,性能提升确实有限,性能达到瓶颈时可以尝试。
【JS】FOR循环通关只循环一次length提高性能的更多相关文章
- for循环,for…in循环,forEach循环的区别
for循环,for…in循环,forEach循环的区别for循环通关for循环,生成所有的索引下标for(var i = 0 ; i <= arr.length-1 ; i++){ 程序内容 } ...
- js中的分支与循环
一.js的分支结构 js的分支结构包括:if-else结构.多重if结构.嵌套if结构和switch-case结构 1.if-else结构 1.结构的写法: if(判断条件){ //条件为 ...
- js for等循环 跳出多层循环
js for 循环 跳出多层循环 ,,,,,,,]; // 8个数 ,,,,,,,]; //8个数 testFor(); console.log(') function testFor() { ;k& ...
- 前端(十二)—— JavaScript基础操作:if语句、for循环、while循环、for...in、for...of、异常处理、函数、事件、JS选择器、JS操作页面样式
JavaScript基础操作 一.分支结构 1.if语句 if 基础语法 if (条件表达式) { 代码块; } // 当条件表达式结果为true,会执行代码块:反之不执行 // 条件表达式可以为普通 ...
- js模版引擎handlebars.js实用教程——each-基本循环使用方法
返回目录 <!DOCTYPE html> <html> <head> <META http-equiv=Content-Type content=" ...
- JS脚本语言里的循环
js脚本语言: 循环:(循环操作某一个功能(执行某段代码)) 四要素: 循环初始值 循环条件 状态改变 循环体 for(穷举 迭代) while 举例:(穷举) 与7相关的数 <scr ...
- 【js jQuery】map集合 循环迭代取值---以及 map、json对象、list、array循环迭代的方法和区别
后台给前台传来一个map @ResponseBody @RequestMapping(value = "getSys") public Map<Long,String> ...
- MySql 存储过程 光标只循环一次
[1]MqSql 存储过程 光标只循环一次 针对MySql存储过程,光标只循环一次就退出的场景,可能原因分析: (1)存储过程有问题(仔细检查语法.控制变量.条件等等) (2)保证存储过程正确.调用过 ...
- [转]如何在 JS 代码中消灭 for 循环
一,用好 filter,map,和其它 ES6 新增的高阶遍历函数 二,理解和熟练使用 reduce 三,用递归代替循环(可以break!) 四,使用高阶函数遍历数组时可能遇到的陷阱 五,死磕到底,T ...
随机推荐
- C#中REF和OUT的区别
在C# 中,既可以通过值也可以通过引用传递参数.通过引用传递参数允许函数成员更改参数的值,并保持该更改.若要通过引用传递参数, 可使用ref或out关键字.ref和out这两个关键字都能够提供相似的功 ...
- CASS 2008的野外操作码
表D-1 线面状地物符号代码表 坎类(曲): K(U) + 数(0-陡坎,1-加固陡坎,2-斜坡,3-加固斜坡,4-垄,5-陡崖,6-干沟) 线类(曲): X(Q) + 数(0-实线,1-内 ...
- 华为c8812刷机/rom之后,本地音乐无法设置为铃声解决方法【亲测】
手机刷机后,来电铃声和通知铃声可以总能找到办法设置,但闹钟铃声想设置本地音乐,总是没反应,抓狂!!! 后来终于找到了解决办法,很简单:装一个软件——华为音乐,就可以设置了! 吐槽一下,这个手机买电信送 ...
- Adapter 启动时报错
如果把Adapter安装到C盘,有时在启动Adapter的时候会抛出java.io.IOException: Cannot run program "C:\tibco\adapter\adr ...
- MicroERP软件更新记录1.0
版本号:1.0.256 本次: 1\修复了选择货位时的BUG; 2\增加了物品资料由EXCEL表批量导入的功能; 3\物品资料增加了三个自定义属性; 4\优化了科目汇总账(余额表)算法; 5\应大家建 ...
- Jackson ObjectMapper类使用解析
/** * Jackson ObjectMapper类 */ //ObjectMapper类是Jackson库的主要类.它提供一些功能将转换成Java对象匹配JSON结构,反之亦然.它使用JsonPa ...
- 黑马程序员——C语言基础 字符串
Java培训.Android培训.iOS培训..Net培训.期待与您交流! (以下内容是对黑马苹果入学视频的个人知识点总结) (一)字符串 1>字符串是由多个字符组合在一起形成的 2>初始 ...
- a标签
a链接是一种触发行为元素,行内元素 属性:href/target/class/id/title href: <a href="www.baidu.com"></a ...
- 涵涵和爸爸习惯养成进度表(二)(May 30 - )
规则说明 22天内,没有哭脸,不超过三个无表情脸,可以给一个奖励(动画书等) 涵涵违反规则,在爸爸和妈妈都同意的情况下,可以给无表情脸 爸爸违反规则,在妈妈和涵涵都同意的情况下,可以给无表情脸 获奖记 ...
- 关于GridView的第一个item图片加载不出来问题
首先感谢csdn里的id 大神了没 的博客 地址:http://blog.csdn.net/wenyiqingnianiii/article/details/39291667 原因在positi ...