JavaScript基础概念之----性能优化

一、加载与执行

  1. body闭合标签之前,将所有的script标签放到页面的底部,能确保在脚本执行前页面已经完成渲染
  2. 合并脚本,页面中script标签越少,加载越快,响应也更迅速
  3. 使用多种无阻塞下载Javascript方法:
    • 使用script标签的defer属性
    • 使用动态创建script元素来下载并执行代码
    • 使用XHR对象下载 Javascript代码并注入页面中

二、数据存取

  • 访问字面量和局部变量的速度最快,相反,访问数组和对象相对较慢
  • 由于局部变量存在于作用域的起始位置,因此访问局部变量比访问跨作用域变量更快。变量在作用域链中的位置越深,访问所需时间越长,由于全局变量总处在作用域链的最末端,因此访问速度最慢
  • 避免使用 with 语句,因为它会改变执行环境作用域链。同样,try-catch语句中的catch子句也有同样的影响
  • 嵌套的对象成员会明显影响性能,尽量少用
  • 属性或方法在原型链中的位置越深,访问它的速度也越慢
  • 通过把常用的对象,数组,跨域变量保存在局部变量中,来改善javascript的性能,因为局部变量访问速度最快

三、DOM编辑

  • 最小化 DOM 访问次数,尽可能在javascript端处理
  • 如果需要多次访问某个DOM节点,请使用局部变量存储它的引用
  • 小心处理HTML集合,因为它实时连系着底层文档。把集合的长度缓存到一个变量中,并在迭代中使用它。如果需要经常操作集合,建议把它拷贝到一个数组中
  • 如果可能的话,使用速度更快的API,比如 querySelectorAll() 和 firstElementChild
  • 要留意重绘和重排,批量修改样式时,‘离线’操作DOM树,使用缓存,并减少访问布局信息的次数
  • 使用事件委托来减少事件处理器的次数

四、算法和流程控制

  • for、while和do-while循环性能特性相当,并没有一种循环类型明显快于或慢于其他类型
  • 避免使用 for-in 循环,除非你需要遍历一个属性数量未知的对象
  • 改善循环性能的最佳方式是减少每次迭代的运算量和减少循环迭代次数
  • 通常来说,swich 总是比 if-else 块,但并不总是最佳解决方案
  • 在判断条件较多时,使用查找表比 if-else 和 switch 更快
  • 浏览器的调用栈大小限制了递归算法在 javascript 中的应用,栈溢出错误会导致其他代码中断运行
  • 如果你遇到栈溢出错误,可将方法改为迭代算法,或使用 Memoization 来避免重复计算

五、字符串和正则表达式

  • 当连接数据巨大或尺寸巨大的字符串时,数组项合并是唯一在IE7及更早版本中性能合理的方法
  • 如果不需要考虑IE7及更早版本的性能,数组项合并是最慢的字符串连接方法之一。推荐使用简单的+和+=操作符替代,避免不必要的中间字符串
  • 回溯既是正则表达式匹配功能的基本组成部分,也是正则表达式的低效之源
  • 回溯失控发生在正则表达式本应快速匹配的地方,但因为某些特殊的字符串匹配动作导致运行缓慢甚至浏览器崩溃。避免这个问题的办法是:使相邻的字元互斥,避免嵌套量词对同一字符串的相同部分多次匹配,通过重复利用预查的原子组去除不必要的回溯
  • 提高正式表达式效率的各种技术手段会有助于正则表达式更快地匹配,并在非匹配位置上花更少的时间
  • 正则表达式并不总是完成工作的最佳工具,尤其当你只搜索字面字符串的时候
  • 尽管有许多方法可以去除字符串的首尾空白,但使用两个简单的正则表达式(一个去除头部空白,一个去除尾部空白)来处理大量字符串内容能提供一个简洁而跨浏览器的方法。从字符串末尾开始循环向前搜索第一个非空白字符,或者将此技术同正则表达式结合起来,会提供一个更好的替代方案,它很少受到字符串长度影响

六、快速响应的用户界面

  • 任何 Javascript 任务都不应当执行超过 100 毫秒。过长的运行时间会导致 UI 更新出现明显的延迟,从而对用户体验产生负面影响
  • Javascript 运行期间,浏览器响应用户交互的行为存在差异。无论如何,Javascript 长时间运行将导致用户体验变得混乱和脱节
  • 定时器可用来安排代码延迟执行,它使得你可以把长时间运行脚本分解成一系列的小任务
  • Web Workers 是新版浏览器支持的特性,它允许你在 UI 线程外部执行 Javascript 代码,从而避免锁定 UI

七、Ajax

  • 了解项目的具体需求,选择正确的数据格式和与之匹配的传输技术
  • 作为数据格式,纯文本和HTML只适用于特定场合,但它们可以节省客户端的CPU周期。XML被广泛应用且支持性良好,但是它十分笨重且解析缓慢。JSON是轻量级的,解析速度快,通用性与XML相当。字符分隔的自定义格式十分轻量,在解析大量数据集时非常快,但需要编写额外的服务器构造程序,并在客户端解析。
  • 从页面当前所处的域下请求数据时,XHR提供了最完善的控制和灵活性,尽管它会把接收到的所有数据当成一个字符串,且这有可能降低解析速度。另一方面,动态脚本注入允许跨域请求和本地执行Javascript和JSON,但是它的接口不那么安全,而且还不能读取头信息或响应代码。Multipart XHR 可以用来减少请求数,并处理一个响应中的各种文件类型,但是它不能缓存接收到的响应。当需要发送数据时,图片信标是一种简单而有效的方法。XHR可以用POST方法发送大量数据。
  • 减少请求数,可以通过合并javascript和css文件,或使用MXHR
  • 缩短页面的加载时间,页面主要内容加载完成后,用Ajax获取那些次要的文件
  • 确保你的代码错误不会输出给用户,并在服务器端处理错误
  • 知道何时使用成熟的Ajax类库,以及何时编写自己的底层 Ajax代码

八、编程实践

  • 通过避免使用eval() 和 Function() 构造器来避免双重求值带来的性能消耗。同样的,给setTimeout() 和 setInterval()传递函数 而不是 字符串 作为参数
  • 尽量直接使用直接量创建对象和数组。直接量的创建和初始化都比非直接量形式要快
  • 避免做重复的工作,当需要检测浏览器时,可使用延迟加载或条件预加载
  • 在进行数学计算时,考虑使用直接操作数字的二进制形式的位运算
  • Javascript 在原生方法 总会比自己写的任何代码都要快。尽量使用原生方法

九、部署

  • 合并javascript文件以减少HTTP请求数
  • 压缩 Javascript文件
  • 在服务器端压缩 Javascript文件
  • 通过正确设置HTTP响应头来缓存 Javascript文件,通过向文件名增加时间戳来避免缓存问题
  • 使用CDN提供Javascript文件;CDN不仅可以提升性能,它也为你管理文件的压缩和缓存

十、工具

  • 使用网络分析工具找出加载脚本和页面中共他资源的瓶颈,这会帮助你决定哪些脚本需要延迟加载,或者需要进一步分析
  • 尽管传统的经验告诉我们要尽量减少HTTP请求数,但把脚本尽可能延迟加载可以加快页面渲染速度,给用户带来更好的体验
  • 使用性能分析工具找出脚本运行过程中速度慢的地方,检查每个函数所消耗的时间,以及函数被调用的次数,通过调用栈自身提供的一些线索来找出需要集中精力优化的地方
  • 尽管耗费的时间和调用次数通常是数据中最有价值的部分,但仔细观察函数的调用过程,你也许会发现其他优化目标

原文地址:https://www.cnblogs.com/adhehe/p/9812178.html

时间: 2024-10-10 15:04:45

JavaScript基础概念之----性能优化的相关文章

js基础--javascript基础概念之语句(二)

js基础--javascript基础概念之语句(二)label,break,continue.. break .  continue 语句. break  continue 语句用于在循环中精确控制代码的执行,其中break语句会立即退出循环,执行循环后面的语句. continue 则退出循环后返回到再次进入循环中. 如: var num = 0; for(var i = 0; i<=100; i++){ if(i >= 10){ break; } num = i; } alert(num);

js基础--javascript基础概念之语法

掌握一门语言 必须先掌握它的语法! javascript 的语法和C.Java.Perl 的语法有些相似.但是比它们更加宽松. javascript 中的一切都是严格区分大小写的.例如变量: demo 和 Demo 两个变量是完全不同的. javascript 标示符,所谓标示符 是指 变量.函数.属性 的名字或函数的参数.标示符的格式是按照以下规则组合的一个或多个字符. 1.第一个字符必须是字母,下划线,或 $ 符号. 2.其他字符可以是字母.下划线.$ . 或数字. 注意 不能把关键字 保留

js基础--javascript基础概念之数组(二)

js基础--javascript基础概念之数组 数组栈方法 数组可以像栈一样.栈是一种先进后出的数据结构,最先添加的数据最后一个出来.栈方法添加数据也称为 推入  移除数据称为 弹出. js为数值栈方法提供了 push()   和  pop() ;  两个方法. push() push() 方法接受参数就是你要添加进入到数组的值.push()  方法会将他们逐一添加到数组的末尾  数组的length属性会跟着更新数据. *push(多个数组元素值) 返回的修改后的数组长度 var array =

js基础--javascript基础概念之数组

js基础--javascript基础概念之数组 在ECMAScript 中 ,数组是很常用的数据类型,js中的数组和其他很多语言的数组有明显的区别.js的数组可以保持任何类型的数值,一个数组中可以保存着多个不同类型的数值.js数组大小(长度)是可以调整的.可以随着数据的添加自动增长数组长度. 创建数组: 一.数组字面量 数组字面量由一对包含数组项的方括号[]表示. var array = [ 'kin', 'cheong', 'change', 'hello', 'haha', 'hi' ];

js基础--javascript基础概念之变量与作用域

js基础--javascript基础概念之变量.作用域 javascript按照ECMA-262 的定义,变量与其他语言变量有所不同.js变量时松散的,不需要事先定义变量类型的.这使得他只是一个保存特定值的一个名称.变量与其数据类型可以在脚本的生命周期内改变. 还有明白几点: JavaScript的变量作用域是基于其特有的作用域链的,JavaScript没有块级作用域. 基本类型和引用类型的值 ECMAScript 的变量有两种不同的数据类型:分别是 基本数据类型值 和 引用类型值 : 基本数据

js基础--javascript基础概念之语句

js基础--javascript基础概念之语句 ECMA-262定义了一组语句(流程控制语句) 语句定义了EMCAScript 语法. 常见的if语句. 语法: if(condition) statement1 else statement2 其中.Condition 可以是任意表达式.而且对这个表达式求值的结果不一定是布尔值.因为script 会自动调用boolean 将值转换为布尔值.如果condition 的值是 true .则执行statement1 语句  否则  执行 stateme

[转载]网站前端性能优化之javascript和css——网站性能优化

之前看过Yahoo团队写的一篇关于网站性能优化的文章,文章是2010年左右写的,虽然有点老,但是很多方面还是很有借鉴意义的.关于css的性能优化,他提到了如下几点: CSS性能优化 1.把样式表置于顶部 现把样式表放到文档的< head />内部似乎会加快页面的下载速度.这是因为把样式表放到< head />内会使页面有步骤的加载显示. 注重性能的前端服务器往往希望页面有秩序地加载.同时,我们也希望浏览器把已经接收到内容尽可能显示出来.这对于拥有较多内容的页面和网速较慢的用户来说特

学习javascript总结下来的性能优化的小知识(二)

上面一篇文章大致介绍了一些javascript当中使用的一些小技巧,当下这篇文章继续介绍一下内存管理.松散耦合.性能方面的一些小知识.为避免错误应该注意的点 内存管理 1.循环引用 如果循环引用中包含DOM对象或者ActiveX对象,那么就会发生内存泄露.内存泄露的后果是在浏览器关闭前,即使是刷新页面,这部分内存不会被浏览器释放. 简单的循环引用: var el = document.getElementById('MyElement'); var func = function () { //

【夯实Mysql基础】MySQL性能优化的21个最佳实践 和 mysql使用索引

本文地址 分享提纲: 1.为查询缓存优化你的查询 2. EXPLAIN 你的 SELECT 查询 3. 当只要一行数据时使用 LIMIT 1 4. 为搜索字段建索引 5. 在Join表的时候使用相当类型的例,并将其索引 6. 千万不要 ORDER BY RAND() 7. 避免 SELECT * 8. 永远为每张表设置一个ID 9. 使用 ENUM 而不是 VARCHAR 10. 从 PROCEDURE ANALYSE() 取得建议 11. 尽可能的使用 NOT NULL 12. Prepare