js 性能优化之算法和流程控制

发布时间 - 2026-01-10 23:04:56    点击率:

循环处理是最常见的编程模式之一,也是提升性能必须关注的要点之一。

常见的优化方案有:

①JavaScript的四种循环(for、do-while、while、for-in)中,for-in循环比其他几种明显要慢。由于每次迭代操作会同时搜索实例或原型属性,for-in循环的每次迭代都会产生更多的开销,所以比其他类型要慢。因此遍历一个属性数量有限的已知属性列表,可以这样优化:

var props = ['prop1', 'prop2'],i = 0;
whlie(i < props.length){
 precess(object[props[i++]]);
}

该代码只关注给定的属性,减少了循环的开销。

而对于,for、while、do-while。我在chrome下测试了一下,先创建一个大小为1000000的数组,每项乘100再叠加。

测试用例:

window.onload = function(){
var items = Array(1000000).join(',').split(',').map(function(item, index) {
   return index;
});
 console.log(forCircle())
 console.log(whileCircle())
 console.log(doCircle())
function forCircle(){
console.profile();
var currTime = new Date();
 var tal = 0;
 for(var i = 0;i < items.length; i++){
  tal = tal + process(items[i]);
 }
 console.profileEnd();
 console.log('forCircle用时:' + (new Date() - currTime) + 'ms');
 return tal;
}
function whileCircle(){
console.profile();
var currTime = new Date();
 var tal = 0;
 var j = 0;
 while (j < items.length){
  tal = tal + process(items[j++]);
 }
 console.profileEnd();
 console.log('whileCircle用时:' + (new Date() - currTime) + 'ms');
 return tal;
}
function doCircle(){
console.profile();
var currTime = new Date();
 var tal = 0;
 var k = 0;
 do{
  tal = tal + process(items[k++]);
 }while (k < items.length)
  console.profileEnd();
 console.log('doCircle用时:' + (new Date() - currTime) + 'ms');
 return tal;
}
function process(item){
 return item*100;
}
}

取某次测试结果:

平均来说,for循环耗时8ms,while耗时4ms,doWhile耗时也是4ms。for是最慢的。

②减少迭代的工作量。把数组长度保存在局部变量中再遍历、颠倒数组的遍历顺序。

最常见的一个循环:

for(var i = 0;i < items.length; i++){
 process(items[i]);
}
//
var j = 0;
while (j < items.length){
 process(items[j++]);
}
//
var k = 0;
do{
 process(items[k++]);
}while (k < items.length)

在这个循环中,每次运行都会产生如下操作:

①查找一次属性(items.length)

②执行数值比较一次(i < items.length) 

③查看控制条件是否为true(i < items.length ==true) 

④一次自增操作(i++)

⑤一次数组查找(items[i])

⑥一次函数调用(process(items[i]))

若把数组长度存到一个局部变量,那么就不需要每次都查找一次items.length,也就提高了性能。

改为这样:

for(var i = 0, len = items.length;i < len; i++){
 process(items[i]);
}
//
var j = 0,
count = items.length;
while (j < count){
 process(items[j++]);
}
//
var k = 0,
num = items.length;
do{
 process(items[k++]);
}while (k < num)

这样在大多数浏览器中能节省大概25%的运行时间(IE中甚至可以节省50%)。总的来说,循环次数大的情况下,运行时间确实有提升。取某次结果如下:

没有局部存量存储数组长度时:

有局部变量存储数组长度时:

③减少迭代次数,“Duffs Device”即“达夫设备“循环体展开技术。适合于迭代次数较大的情况下。

摘抄一下书中达夫设备的基本理念:每次循环中最多可 8 次调用 process()函数。循环迭代次数为元素总数除以8。 因为总数不一定是 8的整数倍, 所以 startAt 变量存放余数, 指出第一次循环中应当执行多少次 process()。比方说现在有 12 个元素,那么第一次循环将调用 process()4次,第二次循环调用 process()8 次,用 2 次循环代替了 12次循环。

基本模式:

var iterations = Math.floor(items.length/8), 
 startAt = items.length%8, 
 i = 0; 
do{ 
 switch(startAt){ 
  case 0 : process(items[i++]); 
  case 7 : process(items[i++]); 
  case 6 : process(items[i++]); 
  case 5 : process(items[i++]); 
  case 4 : process(items[i++]); 
  case 3 : process(items[i++]); 
  case 2 : process(items[i++]); 
  case 1 : process(items[i++]); 
 } 
 startAt = 0; 
 }while(--iterations); 

④基于函数的迭代比基于循环的迭代消耗性能更多。例:for循环迭代与forEach函数迭代。 

⑤优化if-else,通常来说,switch比if-else快,但是在判断条件较多时,使用查找表比if-else和switch都快。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持! 


# js  # 性能优化  # JavaScript中条件语句的优化技巧总结  # JS性能优化实现方法及优点进行  # javascript实现前端成语点击验证优化  # JS代码优化的8点建议  # JavaScript深入V8引擎以及编写优化代码的5个技巧  # 通过循环优化 JavaScript 程序  # js尾调用优化的实现  # 原生JS实现图片懒加载之页面性能优化  # 浅析JavaScript异步代码优化  # Javascript前端优化代码  # 迭代  # 遍历  # 最常见  # 情况下  # 达夫  # 我在  # 在这个  # 也就  # 最多  # 就不  # 几种  # 书中  # 都快  # 每次都  # 四种  # 适合于  # 创建一个  # 中能  # 数为  # 比方说 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 微信小程序 五星评分(包括半颗星评分)实例代码  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  Laravel怎么为数据库表字段添加索引以优化查询  Win11关机界面怎么改_Win11自定义关机画面设置【工具】  北京专业网站制作设计师招聘,北京白云观官方网站?  香港服务器WordPress建站指南:SEO优化与高效部署策略  zabbix利用python脚本发送报警邮件的方法  Laravel如何创建自定义Artisan命令?(代码示例)  Python数据仓库与ETL构建实战_Airflow调度流程详解  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  开心动漫网站制作软件下载,十分开心动画为何停播?  如何选择PHP开源工具快速搭建网站?  如何彻底卸载建站之星软件?  Laravel Asset编译怎么配置_Laravel Vite前端构建工具使用  如何快速登录WAP自助建站平台?  Win11怎么查看显卡温度 Win11任务管理器查看GPU温度【技巧】  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  如何快速重置建站主机并恢复默认配置?  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  网站制作软件免费下载安装,有哪些免费下载的软件网站?  *服务器网站为何频现安全漏洞?  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  如何在建站之星绑定自定义域名?  如何有效防御Web建站篡改攻击?  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  Android利用动画实现背景逐渐变暗  IOS倒计时设置UIButton标题title的抖动问题  jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  如何为不同团队 ID 动态生成多个“认领值班”按钮  详解Nginx + Tomcat 反向代理 负载均衡 集群 部署指南  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】  Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南  Android中AutoCompleteTextView自动提示  北京的网站制作公司有哪些,哪个视频网站最好?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?  哪家制作企业网站好,开办像阿里巴巴那样的网络公司和网站要怎么做?  html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】  Laravel观察者模式如何使用_Laravel Model Observer配置  实例解析Array和String方法  轻松掌握MySQL函数中的last_insert_id()  Python函数文档自动校验_规范解析【教程】  如何安全更换建站之星模板并保留数据?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置