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权限判定与策略规则配置

