问题来源于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提高性能的更多相关文章

  1. for循环,for…in循环,forEach循环的区别

    for循环,for…in循环,forEach循环的区别for循环通关for循环,生成所有的索引下标for(var i = 0 ; i <= arr.length-1 ; i++){ 程序内容 } ...

  2. js中的分支与循环

    一.js的分支结构 js的分支结构包括:if-else结构.多重if结构.嵌套if结构和switch-case结构 1.if-else结构 1.结构的写法:    if(判断条件){    //条件为 ...

  3. js for等循环 跳出多层循环

    js for 循环 跳出多层循环 ,,,,,,,]; // 8个数 ,,,,,,,]; //8个数 testFor(); console.log(') function testFor() { ;k& ...

  4. 前端(十二)—— JavaScript基础操作:if语句、for循环、while循环、for...in、for...of、异常处理、函数、事件、JS选择器、JS操作页面样式

    JavaScript基础操作 一.分支结构 1.if语句 if 基础语法 if (条件表达式) { 代码块; } // 当条件表达式结果为true,会执行代码块:反之不执行 // 条件表达式可以为普通 ...

  5. js模版引擎handlebars.js实用教程——each-基本循环使用方法

    返回目录 <!DOCTYPE html> <html> <head> <META http-equiv=Content-Type content=" ...

  6. JS脚本语言里的循环

    js脚本语言:  循环:(循环操作某一个功能(执行某段代码)) 四要素: 循环初始值  循环条件  状态改变  循环体 for(穷举  迭代) while 举例:(穷举) 与7相关的数 <scr ...

  7. 【js jQuery】map集合 循环迭代取值---以及 map、json对象、list、array循环迭代的方法和区别

    后台给前台传来一个map @ResponseBody @RequestMapping(value = "getSys") public Map<Long,String> ...

  8. MySql 存储过程 光标只循环一次

    [1]MqSql 存储过程 光标只循环一次 针对MySql存储过程,光标只循环一次就退出的场景,可能原因分析: (1)存储过程有问题(仔细检查语法.控制变量.条件等等) (2)保证存储过程正确.调用过 ...

  9. [转]如何在 JS 代码中消灭 for 循环

    一,用好 filter,map,和其它 ES6 新增的高阶遍历函数 二,理解和熟练使用 reduce 三,用递归代替循环(可以break!) 四,使用高阶函数遍历数组时可能遇到的陷阱 五,死磕到底,T ...

随机推荐

  1. Android中的自定义视图控件

    简介 当现有控件不能满足需求时,就需要自定义控件. 自定义控件属性 自定义控件首先要继承自View,重写两个构造函数. 第一个是代码中使用的: public MyRect(Context contex ...

  2. Visro 应用的前端模板工具介绍 -JsRender

    1.什么是JsRender: JsRender是一款JavaScript模版引擎,是具有简单直观,功能强大,可扩展的,早期版本是基于JQUERY 写的,后来作者重构了,就不再依赖JQUERY了. 它的 ...

  3. win下Redis安装使用

    官网上没有windows版本的Redis,好在github上有大牛写的win版本.地址如下https://github.com/dmajkic/redis/downloads 解压后运行目录下的red ...

  4. 杭电ACM1000

    #include <stdio.h> int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF) { p ...

  5. Qt之C语言有符号数与无符号数运算

    以32位的stm32f4为例: 1.  uint32_t t_int_k = 239773, t_int_km1 = 4294859707; 则t_int_k - t_int_km1 > 0; ...

  6. eap-ttls/mschapv2

    eap-ttls/mschapv2       文件路径 用途 示例 备注 #gedit /usr/local/etc/raddb/sites-available/default #gedit /us ...

  7. css3实现头像旋转功能(超easy!!!)

    简单好玩的头像旋转功能 html结构 <body> <img src="https://a-ssl.duitang.com/uploads/item/201604/29/2 ...

  8. 清除缓存,计算Sql Server查询效率

    --优化之前 DBCC FREEPROCCACHE DBCC DROPCLEANBUFFERS SET STATISTICS IO ON select Dtime,Value from dbo.his ...

  9. 持续集成配置-Teamcity

    1.安装目录\buildagent\work\每个项目下一个文件夹\src下是源 目的: 2. 安装目录\buildagent\work\每个项目下一个文件夹\src下是源 目的是teamcity中配 ...

  10. 如何用vs2010打开vs2013的项目?

    众所周知,用vs2013打开vs2010十分简单,无须做什么. 从VS2010开始,不再制作专有的文件格式,这只是一个xml格式的文本文件,其中决定了解决方案的平台工具集和VS版本. 既然.sln只是 ...