JS优化原则

NXP实战笔记(十五):32K3xx基于RTD-SDK在S32DS上安装HSE之后,进行AB SWAP功能实现OTA升级。 1.HSE 切换服务相关的变量,要放在合理的内存空间,可以参照HSE 安装的潜在失败原因分析。例如,在切换过程中,存在下面的变量,如果不放在dtcm或者no-cable的话,可能会导致切换不成功(非常重要)。链接文件里面设置2.连续两次操作,间隔时间太短,一般认为小于1s.如果连续两次切换,会导致程序死掉。但是重新上电reset之后,程序仍然会执行切换后block的程序。解释如下图:3.切换时未获取SU权限。但在实际的项目工程中,经调试发现如果不获取SU权限,也可以实现。 阅读详情

首先,与其他语言不同,JS的效率很大程度是取决于JS engine的效率。除了引擎实现的优劣外,引擎自己也会为一些特殊的代码模式采取一些优化的策略。例如FF、Opera和Safari的JS引擎,都对字符串的拼接运算(+)做了特别优化。显然,要获得最大效率,就必须要了解引擎的脾气,尽量迎合引擎的口味。所以对于不同的引擎,所作的优化极有可能是背道而驰的。

而如果做跨浏览器的web编程,则最大的问题是在于IE6(JScript 5.6)!因为在不打hotfix的情况下,JScript引擎的垃圾回收的bug,会导致其在真实应用中的performance跟其他浏览器根本不在一个数量级上。因此在这种场合做优化,实际上就是为JScript做优化!

所以第一原则就是只需要为IE6(未打补丁的JScript 5.6或更早版本)做优化!

如果你的程序已经优化到在IE6下可以接受的性能,那基本上在其他浏览器上性能就完全没有问题。

因此,注意我下面讲的许多问题在其他引擎上可能完全不同,例如在循环中进行字符串拼接,通常认为需要用Array.join的方式,但是由于SpiderMonkey等引擎对字符串的“+”运算做了优化,结果使用Array.join的效率反而不如直接用“+”!但是如果考虑IE6,则其他浏览器上的这种效率的差别根本不值一提。

JS优化与其他语言的优化也仍然有相同之处。比如说,不要一上来就急吼吼的做优化,那样毫无意义。优化的关键,仍然是要把精力放在最关键的地方,也就是瓶颈上。一般来说,瓶颈总是出现在大规模循环的地方。这倒不是说循环本身有性能问题,而是循环会迅速放大可能存在的性能问题。

所以第二原则就是以大规模循环体为最主要优化对象。

以下的优化原则,只在大规模循环中才有意义,在循环体之外做此类优化基本上是没有意义的。

目前绝大多数JS引擎都是解释执行的,而解释执行的情况下,在所有操作中,函数调用的效率是较低的。此外,过深的prototype继承链或者多级引用也会降低效率。JScript中,10级引用的开销大体是一次空函数调用开销的1/2。这两者的开销都远远大于简单操作(如四则运算)。

所以第三原则就是尽量避免过多的引用层级和不必要的多次方法调用。

特别要注意的是,有些情况下看似是属性访问,实际上是方法调用。例如所有DOM的属性,实际上都是方法。在遍历一个NodeList的时候,循环条件对于nodes.length的访问,看似属性读取,实际上是等价于函数调用的。而且IE DOM的实现上,childNodes.length每次是要通过内部遍历重新计数的。(My god,但是这是真的!因为我测过,childNodes.length的访问时间与childNodes.length的值成正比!)这非常耗费。所以预先把nodes.length保存到js变量,当然可以提高遍历的性能。

同样是函数调用,用户自定义函数的效率又远远低于语言内建函数,因为后者是对引擎本地方法的包装,而引擎通常是c,c++,java写的。进一步,同样的功能,语言内建构造的开销通常又比内建函数调用要效率高,因为前者在JS代码的parse阶段就可以确定和优化。

所以第四原则就是尽量使用语言本身的构造和内建函数。

这里有一个例子是高性能的String.format方法。String.format传统的实现方式是用String.replace(regex, func),在pattern包含n个占位符(包括重复的)时,自定义函数func就被调用n次。而这个高性能实现中,每次format调用所作的只是一次Array.join然后一次String.replace(regex, string)的操作,两者都是引擎内建方法,而不会有任何自定义函数调用。两次内建方法调用和n次的自定义方法调用,这就是性能上的差别。

同样是内建特性,性能上也还是有差别的。例如在JScript中对于arguments的访问性能就很差,几乎赶上一次函数调用了。因此如果一个可变参数的简单函数成为性能瓶颈的时候,可以将其内部做一些改变,不要访问arguments,而是通过对参数的显式判断来处理。

比如:

代码
  1. function sum() {   
  2.     var r = 0;   
  3.     for (var i = 0; i < arguments.length; i++) {   
  4.         r += arguments[i];   
  5.     }   
  6.     return r;   
  7. }   

这个sum通常调用的时候个数是较少的,我们希望改进它在参数较少时的性能。如果改成:
代码
  1. function sum() {   
  2.     switch (arguments.length) {   
  3.         case 1: return arguments[0];   
  4.         case 2: return arguments[0] + arguments[1];   
  5.         case 3: return arguments[0] + arguments[1] + arguments[2];   
  6.         case 4: return arguments[0] + arguments[1] + arguments[2] + arguments[3];   
  7.         default:   
  8.             var r = 0;   
  9.             for (var i = 0; i < arguments.length; i++) {   
  10.                 r += arguments[i];   
  11.             }   
  12.             return r;   
  13.     }   
  14. }   

其实并不会有多少提高,但是如果改成:
代码
  1. function sum(a, b, c, d, e, f, g) {   
  2.     var r = a ? b ? c ? d ? e ? f ? a + b + c + d + e + f : a + b + c + d + e : a + b + c + d : a + b + c : a + b : a : 0;   
  3.     if (g === undefined) return r;   
  4.     for (var i = 6; i < arguments.length; i++) {   
  5.         r += arguments[i];   
  6.     }   
  7.     return r;   
  8. }   

就会提高很多(至少快1倍)。

 

最后是第五原则,也往往是真实应用中最重要的性能障碍,那就是尽量减少不必要的对象创建。

本身创建对象是有一定的代价的,但是这个代价其实并不大。最根本的问题是由于JScript愚蠢之极的垃圾回收调度算法,导致随着对象个数的增加,性能严重下降(据微软的人自己说复杂度是O(n^2))。

比如我们常见的字符串拼接问题,经过我的测试验证,单纯的多次创建字符串对象其实根本不是性能差的原因。要命的是在对象创建期间的无谓的垃圾回收的开销。而Array.join的方式,不会创建中间字符串对象,因此就减少了那该死的垃圾回收的开销。

因此,如果我们能把大规模对象创建转化为单一语句,则其性能会得到极大的提高!例如通过构造代码然后eval——实际上PIES项目中正在根据这个想法来做一个专门的大规模对象产生器……

好了上面就是偶总结的JS优化五大原则。

除了这些原则以外,还有一些特殊情况,如DOM的遍历,以后有时间再做讨论。

 关于DOM遍历的补充:

如前所述,IE6 DOM中childNodes.length每次都是要遍历所有节点统计个数得出的。而childNodes[i]的访问,也要遍历直到第i个元素。所以在子节点数量巨大的情况下(超过1000),不宜使用for循环来遍历childNodes,否则会死得很惨。而应使用这样的遍历方法:

代码
  1. var node = elem.firstChild;   
  2. while (node != null) {   
  3.     ...   
  4.     node = node.nextSibling;   
  5. }   

 

另一个方式是使用IE自己的DHTML集合属性elem.children,但是它与childNodes不同,不包含文本节点。

只要不出现memory leak,占用内存多并不说明问题。

有两个例子。

第一个例子,Windows系统启动后你就会发现会逐渐占用大量内存,空闲的物理内存通常很少。但是这并不是说明Windows就不好,而是因为它采取不同的内存使用策略(就是尽可能的利用物理内存,比如用作缓存)。

第二个例子,是Java程序,通常jvm也会占据很多内存而很少会释放,这是其垃圾回收策略决定的,并不表示其就不好。

所以以占用内存多来判断浏览器不是好的平台,是站不住脚的。

当然IE7,甚至FF,肯定还是存在某些内存泄露的情况。

opencv实践项目-图片拼接之缝合线算法 opencv 图片缝合线算法 阅读详情

相关推荐

如何加载交易策略EA到MT4/MT5

1、打开MT4/MT5软件 2、首先,必须有一个EA,而且必须是mq4/ex4为扩展名。点击左上角“文件”—“打开数据文件夹”,找到安装路径 3、将EA的ex4或mq4文件放到MT4目录\MQL4\Experts里面(本文以名为Demo的EA为例) 4、如果有DLL库文件,复制到experts目录下的libraries子目录中 5、如果有tpl模板文件,复制到templates目录中 6、添加完成后重启MT4,点击允许EA运行图标 7、在导航中找到刚才安装的EA,拖拽到...

weixin_41364817的博客 7362

JavaScript中的性能优化

如果我们在服务器上启用了缓存,那么浏览器可以将这些文件存储在本地缓存中,并在下一次访问时使用本地缓存,而不是从服务器重新下载文件。因此,在Web应用程序的开发过程中,必须考虑如何优化JavaScript的性能,以提高应用程序的响应速度和用户体验。同时,我们还将讨论一些常见的性能问题,并提供一些实际应用的优化技巧,以帮助读者更好地理解如何在实际项目中进行JavaScript性能优化。合并是将多个文件合并为一个文件的过程。如果我们将它们合并为一个文件,那么可以减少文件的数量,从而提高Web应用程序的性能。

tyxjolin的专栏 1922

ADRV9009学习资料保存:基于XC7Z100+ADRV9009的双收双发无线电射频板卡

ADRV9009学习资料保存:基于XC7Z100+ADRV9009的双收双发无线电射频板卡 一、板卡概述 基于XC7Z100+ADRV9009的双收双发无线电射频板卡是基于XilinxZYNQFPGA和ADI的无线收发芯片ADRV9009开发的专用功能板卡,用于5G小基站,无线图传,数据收发...

9365

分享 18 个JS 代码优化技巧,让你显得更专业

1. 使用箭头函数简化函数定义//传统函数定义 functionadd(a,b){ returna+b; } //箭头函数简化 constadd=(a,b)=>a+b;2. 使用解构赋值简化变量声明//传统变量声明 constfirstName=person.firstName; constlastName=person.lastN...

前端达人 2214

基于单光子探测的高重频多通道符合测距

TDC专栏之基于单光子探测的高重频多通道符合测距

sdau2005的博客 1202

《open3D+pyqt》点云读取、显示与保存

《open3D+pyqt》第一章:点云读取与显示一、效果展示二、环境配置三、代码3.1 qt designer设置3.2 生成ui,qrc的py文件3.3 py文件代码 一、效果展示 二、环境配置 环境配置:Anconda+pycharm+pyqt+open3d+pyqtgraph 显示界面:这里选择pyqtgraph 参考网上教程 三、代码 3.1 qt designer设置 界面布局参照《PCL+QT》教程,界面设置:布局如下: 布局参数参考: 3.2 生成ui,qrc的py文件 3.3 py

阁楼 7113

JavaScript性能优化怎么实现?12种优化方式你知道嘛

在处理一些高频触发的事件(如resize、scroll)时,使用节流(throttling)和防抖(debouncing)可以限制事件处理函数的执行频率,提高性能。对于涉及大量计算或耗时操作的任务,可以将其放入Web Worker中,在后台线程中运行,避免阻塞主线程,提高页面响应性能。将事件监听器绑定到父元素,利用事件冒泡机制来处理子元素的事件,可以减少事件处理函数的数量,提高性能。延迟加载非关键的资源(如图片、脚本等),在用户需要时再进行加载,减少页面初始加载时间,提高用户体验。

肥晨开发的学习之路 2490

基于 Qt C++ 的 2D 动画制作工具

你可以修改它的中心坐标 (X, Y)、宽度 (W)、高度 (H),或点击 "选择颜色" 按钮改变其填充色。* **图形视图 (`QGraphicsView` 和 `QGraphicsScene`)**: 用于显示和编辑当前帧的内容。

寒寒豆豆软件公司的博客 114

JS性能优化

文章目录性能优化介绍内存管理 Memory ManagementJavaScript 中的垃圾回收GC算法介绍引用计数算法实现原理引用计数算法优缺点标记清除算法实现原理标记清除算法优缺点标记整理算法实现原理常见GC算法总结认识V8V8垃圾回收策略V8如何回收新生代对象 性能优化介绍 性能优化是不可避免的 哪些内容可以看做是性能优化 无处不在的前端性能优化 内存管理 垃圾回收与常见 GC 算法 V8 引擎的垃圾回收 Performance 工具 代码优化实例 内存管理 Memory Management

weixin_44581964的博客 1168

数据库系统概论第五版课后习题答案第十二章

对元组的插入、删除、修改;语义检查的具体做法是,DBMS读取数据字典,检查是否存在与该语句中的表、视图或索引等要创建的对象相同的对象名,检查该用户是否具有创建数据库对象的权限。答:操作系统提供的封锁机制和DBMS的封锁机制在封锁对象、封锁对象的状态、封锁的粒度、及封锁的类型上存在很大的差别,操作系统的封锁机制不能直接应用在DBMS中,DBMS必须重新设计,来满足复杂的封锁需求。数据库的建立和维护包括数据库的初始建立、数据的转换、数据库的转储和恢复、数据库的重组织和重构造以及性能监测分析等功能。

wenling54321的博客 693

【ArcGIS Pro微课1000例】0067:ArcGIS Pro3.4.2学习版下载及安装教程

【ArcGIS Pro微课1000例】0067:ArcGIS Pro3.4.2学习版网盘下载及安装教程

智慧空间实验室 2388

js中compositionstart和compositionend事件

需求最近有个需求,根据input输入的文字进行列表过滤。这是个很常见的需求。于是大致的代码如下:<template> <div id="app"&g...

前端队长Daotin 8922

MongoDB分布式事务实现:两阶段提交、日志复制与冲突解决

MongoDB分布式事务机制解析 本文深入剖析了MongoDB 4.0+版本的分布式事务实现原理,重点分析了其在跨文档/跨集合/跨分片场景下的数据一致性解决方案。核心内容包括: 底层机制:采用改进的两阶段提交协议,通过oplog日志复制实现无中心协调器的事务管理,结合WiredTiger存储引擎和锁机制保障ACID特性。 创新设计:将传统2PC的中心协调功能分散到Primary节点,利用oplog作为事务状态记录,实现自动故障恢复和60秒超时回滚机制。 性能优化:针对大事务、写冲突等常见问题,提出拆分微事务

数据知道的博客 1261

小议Javascript代码优化方法及原则

Javascript优化已经讨论了很多了,最近也频繁接触Javascript代码,对Javascript优化也有一些自己的想法,写出一个健壮、高效的代码是每个设计者的最终目标,酒窝最近遇到的一些问题,这里我想从更基础的角度总结在Web开发中Javascript优化的几个原则及方法。原则一,为IE6(未打补丁的JScript 5.6或更早版本)做优化!与其他语言不同,JS的效率很大程度是取决于JS

elimago的专栏 1574

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

js优化原则

转载:http://www.iteye.com/topic/126859 概述:与其他语言不同,JS的效率很大程度是取决于JS engine的效率。除了引擎实现的优劣外,引擎自己也会为一些特殊的代码模式采取一些优化的策略。例如FF、Opera和Safari的JS引擎,都对字符串的拼接运算(+)做了特别优化。显然,要获得最大效率,就必须要了解引擎的脾气,尽量迎合引擎的口味。所以对于不同的引擎,所作

txx3258的专栏 564

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

JavaScript 代码性能优化的基本原则

本文围绕现代 Web 开发中 JavaScript 代码性能优化展开。关键方案包括减少执行时间(避免循环嵌套、缓存 DOM 查询、使用事件委托)、降低内存占用(释放对象、避免泄漏、用弱引用)、优化代码结构(函数节流防抖、代码分割懒加载、避全局变量)及提高可读性(用有意义命名、加注释、循规范)。其应用于 Web 应用,可提升性能、用户体验,降服务器负载。

专注技术分享 838

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

『转』JS优化原则

http://www.iteye.com/topic/126859 首先,与其他语言不同,JS的效率很大程度是取决于JS engine的效率。除了引擎实现的优劣外,引擎自己也会为一些特殊的代码模式采取一些优化的策略。例如FF、Opera和Safari的JS引擎,都对字符串的拼接运算(+)做了特别优化。显然,要获得最大效率,就必须要了解引擎的脾气,尽量迎合引擎的口味。所以对于不同的引擎,所作的...

精致-简洁-唯美 141

前端性能优化十五:js优化的总体原则

【代码】前端性能优化十五:js优化的总体原则。

wanmeijuhao的博客 1100
上一篇: 程序员的素养
下一篇: JS中获得窗口属性的方法
潇湘紫琅
博客等级 码龄24年 6粉丝 7原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值