iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > html >JavaScript代码优化技巧实例分析
  • 933
分享到

JavaScript代码优化技巧实例分析

2024-04-02 19:04:59 933人浏览 薄情痞子
摘要

这篇文章主要介绍“javascript代码优化技巧实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript代码优化技巧实例分析”文章能帮助大家解决

这篇文章主要介绍“javascript代码优化技巧实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript代码优化技巧实例分析”文章能帮助大家解决问题。

JavaScript代码优化技巧实例分析

写在前面

想要做到JavaScript的代码优化,首先需要做的是准确的测试JavaScript的代码执行时间。其实需要做的就是采集大量的执行样本进行数学统计和分析,这里我们使用的是benchmark.js来检测代码的执行情况。

首先我们需要在项目中安装依赖,代码如下:

yarn add benchmark --save
# 或者
npm i benchmark --save

然后我们写一个测试代码,如下所示:

const Benchmark = require('benchmark')
const suite = new Benchmark.Suite()
// 添加测试
suite
  /**
   * add() 方法接受两个参数,其中第一个表示测试的名称,第二个表示测试的内容,他是一个函数*   
/
  .add('join1000', () => {
    new Array(1000).join(' ')
  })
  .add('join10000', () => {
    new Array(10000).join(' ')
  })
  // 添加时间监听
  .on('cycle', event => {
    // 打印执行时间
    console.log(String(event.target))
  })
  // 完成后执行触发的事件
  .on('complete', () => {
    console.log('最快的是:' + suite.filter('fastest').map('name'))
  })
  // 执行测试
  .run({ async: true })

复制代码

代码执行结果如下:

// join1000 x 146,854 ops/sec ±1.86% (88 runs sampled)
// join10000 x 16,083 ops/sec ±1.06% (92 runs sampled)
// 最快的是:join1000

在结果中,ops/sec表示的是每秒执行的次数,当然是越大越好,紧接着是每秒执行次数上下相差的百分比,最后括号中的内容表示共取样多少次。我们可以看到,都是join1000的性能更好一些(我感觉我在说废话)。

慎用全局变量

这里所说的慎用全局变量,为什么要慎用呢?主要有以下几点:

  • 全局变量定义在全局执行上下文,是所有作用域链的顶端。每次查找的时候都从局部找到最顶端,在时间上会有所消耗。

  • 全局执行上下文一直存在于上下文的执行栈,直到程序退出,才会被销毁,内存空间浪费 。

  • 如果某个局部作用域出现了同名的变量则会遮盖或者说污染全局变量 。

下面我们就来写一段代码,看一下全局变量与布局变量在执行效率方面的差异,代码如下:

...
suite
  .add('全局变量', () => {
    // 该函数内模拟全局作用域
    let i,
      str = ''
    for (i = 0; i < 1000; i++) {
      str += i
    }
  })
  .add('局部变量', () => {
    for (let i = 0, str = ''; i < 1000; i++) {
      str += i
    }
  })
...

代码运行结果如下:

全局变量 x 158,697 ops/sec ±1.05% (87 runs sampled)
局部变量 x 160,697 ops/sec ±1.03% (90 runs sampled)
最快的是:局部变量

虽然说差异不大,但是我们可以感知全局变量比局部的性能更差一些。

通过原型新增方法

为构造函数增加实例对象需要的方法时,尽量使用原型的方式添加,而不是构造函数内部进行添加,我们可以看如下测试代码:

...
suite
  .add('构造函数内部添加', () => {
    function Person() {
      this.sayMe = function () {
        return '一碗周'
      }
    }
    let p = new Person()
  })
  .add('原型方式内部添加', () => {
    function Person() {}
    Person.prototype.sayMe = function () {
      return '一碗周'
    }
    let p = new Person()
  })
...

代码运行结果如下:

构造函数内部添加 x 573,786 ops/sec ±1.97% (89 runs sampled)
原型方式内部添加 x 581,693 ops/sec ±3.46% (80 runs sampled)
最快的是:构造函数内部添加

避免闭包中的内存泄露

由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,严重可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除 (即将局部变量重新赋值为null)。

避免使用属性访问方法

在JavaScript中的对象中,避免使用一些属性访问方法,这是因为JavaScript中的所有属性都是外部可见的。

示例代码如下:

...
suite
  .add('使用属性访问方法', () => {
    function Person() {
      this.name = '一碗周'
      this.getName = function () {
        return '一碗周'
      }
    }
    let p = new Person()
    let n = p.getName()
  })
  .add('不使用属性访问方法', () => {
    function Person() {
      this.name = '一碗周'
    }
    let p = new Person()
    let n = p.name
  })
...

代码运行结果如下:

使用属性访问方法 x 406,682 ops/sec ±2.33% (82 runs sampled)
不使用属性访问方法 x 554,169 ops/sec ±2.03% (85 runs sampled)
最快的是:不使用属性访问方法

for循环优化

我们在使用for循环时,可以将有些必要的数据进行缓存,就比如arr.length这种属性,不需要每次判断都获取一下,从而优化我们的代码。

示例代码如下:

...
suite
  .add('正序', () => {
    let arr = new Array(100)
    let str = ''
    for (let i = 0; i < arr.length; i++) {
      str += i
    }
  })
  .add('缓存', () => {
    let arr = new Array(100)
    let str = ''
    for (let i = arr.length; i; i--) {
      str += i
    }
  })
  .add('缓存的另一种写法', () => {
    let arr = new Array(100)
    let str = ''
    for (let i = 0, l = arr.length; i < l; i++) {
      str += i
    }
  })
...

代码运行结果如下:

正序 x 1,322,889 ops/sec ±1.36% (86 runs sampled)
缓存 x 1,356,696 ops/sec ±0.70% (92 runs sampled)
缓存的另一种写法 x 1,383,091 ops/sec ±0.70% (93 runs sampled)
最快的是:缓存的另一种写法

选择最优的循环方式

我们现在常用的循环有forEachforfor...in循环,这几种那个是性能最优的呢,测试代码如下:

...
suite
  .add('forEach', () => {
    let arr = new Array(100)
    let str = ''
    arr.forEach(i => {
      str += i
    })
  })
  .add('for...in', () => {
    let arr = new Array(100)
    let str = ''
    for (i in arr) {
      str += i
    }
  })
  .add('for', () => {
    let arr = new Array(100)
    let str = ''
    for (let i = 0, l = arr.length; i < l; i++) {
      str += i
    }
  })
...

代码运行结果如下:

forEach x 4,248,577 ops/sec ±0.89% (86 runs sampled)
for...in x 4,583,375 ops/sec ±1.15% (91 runs sampled)
for x 1,343,871 ops/sec ±1.91% (88 runs sampled)
最快的是:for...in

由运行结果可以看出我们可以尽量使用for...in或者forEach循环,减少使用for循环。

减少判断层级

减少判断层级就是减少一些if语句的嵌套,如果是一些必要的条件我们可以通过单层if结合return直接跳出函数的执行,关于优化前与优化后的代码执行比对如下所示:

...
/*** 
 接收两类文件,zip 和 rar* 
 压缩包的大小限制为 10 兆* 
/

suite
  .add('嵌套写法', () => {
    function uploadFile(suffix, size) {
      // 允许上传的后缀名
      const suffixList = ['.zip', '.rar']
      const M = 1024*  1024

      if (suffixList.includes(suffix)) {
        if (size <= 10*  M) {
          return '下载成功'
        }
      }
    }
    uploadFile('.zip', 1*  1024*  1024)
  })
  .add('减少判断写法', () => {
    function uploadFile(suffix, size) {
      // 允许上传的后缀名
      const suffixList = ['.zip', '.rar']
      const M = 1024*  1024
      if (!suffixList.includes(suffix)) return
      if (size > 10*  M) return
      return '下载成功'
    }
    uploadFile('.zip', 1*  1024*  1024)
  })
...

代码运行结果如下:

嵌套写法 x 888,445,014 ops/sec ±2.48% (88 runs sampled)
减少判断写法 x 905,763,884 ops/sec ±1.35% (92 runs sampled)
最快的是:减少判断写法,嵌套写法

虽然说差距并不是很大,但是不适用嵌套的代码比普通代码更优一些。

减少作用域链查找层级

减少代码中作用域链的查找也是代码优化的一种方法,如下代码展示了两者的区别:

...
suite
  .add('before', () => {
    var name = '一碗粥'
    function sayMe() {
      name = '一碗周'
      function print() {
        var age = 18
        return name + age
      }
      print()
    }
    sayMe()
  })
  .add('after', () => {
    var name = '一碗粥'
    function sayMe() {
      var name = '一碗周' // 形成局部作用域
      function print() {
        var age = 18
        return name + age
      }
      print()
    }
    sayMe()
  })
...

代码运行结果如下:

before x 15,509,793 ops/sec ±7.78% (76 runs sampled)
after x 17,930,066 ops/sec ±2.89% (83 runs sampled)
最快的是:after

上面代码只是为了展示区别,并没有实际意义。

减少数据读取次数

如果对象中的某个数据在一个代码块中使用两遍以上,这样的话将其进行缓存从而减少数据的读取次数来达到更优的一个性能,

测试代码如下:

...
var userList = {
  one: {
    name: '一碗周',
    age: 18,
  },
  two: {
    name: '一碗粥',
    age: 18,
  },
}
suite
  .add('before', () => {
    function returnOneInfo() {
      userList.one.info = userList.one.name + userList.one.age
    }
    returnOneInfo()
  })
  .add('after', () => {
    function returnOneInfo() {
      let one = userList.one
      one.info = one.name + one.age
    }
    returnOneInfo()
  })
...

代码运行结果如下:

before x 222,553,199 ops/sec ±16.63% (26 runs sampled)
after x 177,894,903 ops/sec ±1.85% (88 runs sampled)
最快的是:before

字面量与构造式

凡是可以使用字面量方式声明的内容,绝对是不可以使用构造函数的方式声明的,两者在性能方面相差甚远,代码如下:

...
suite
  .add('before', () => {
    var str = new String('string')
  })
  .add('after', () => {
    var str = 'string'
  })
...

代码运行结果如下:

before x 38,601,223 ops/sec ±1.16% (89 runs sampled)
after x 897,491,903 ops/sec ±0.92% (92 runs sampled)
最快的是:after

关于“JavaScript代码优化技巧实例分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网html频道,小编每天都会为大家更新不同的知识点。

--结束END--

本文标题: JavaScript代码优化技巧实例分析

本文链接: https://www.lsjlt.com/news/98401.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript代码优化技巧实例分析
    这篇文章主要介绍“JavaScript代码优化技巧实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript代码优化技巧实例分析”文章能帮助大家解决...
    99+
    2024-04-02
  • JavaScript代码优化的技巧实例分析
    本篇内容主要讲解“JavaScript代码优化的技巧实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript代码优化的技巧实例分析”吧!写在前面想要做到JavaScript的代...
    99+
    2023-07-02
  • Python可视化技巧实例代码分析
    这篇“Python可视化技巧实例代码分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Python可视化技巧实例代码分析”文...
    99+
    2023-07-06
  • JavaScript代码优化技巧有哪些
    这篇文章主要介绍“JavaScript代码优化技巧有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“JavaScript代码优化技巧有哪些”文章能帮助大家解决问题。1. 使用扩展运算符解构对象和数...
    99+
    2023-07-05
  • Vue开发技巧实例代码分析
    这篇文章主要讲解了“Vue开发技巧实例代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Vue开发技巧实例代码分析”吧!1.路由参数解耦通常在组件中使用路由参数,大多数人会做以下事情。e...
    99+
    2023-07-05
  • Java代码编写技巧实例分析
    这篇文章主要讲解了“Java代码编写技巧实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java代码编写技巧实例分析”吧!开发工具不知道有多少”老”程序员还在使用 Eclipse,这些...
    99+
    2023-06-30
  • JavaScript 代码优化技巧:让你的代码飞起来!
    一、选择合适的数据结构 数据结构的选择对 JavaScript 代码的性能有很大的影响。不同的数据结构适合不同的应用场景。常用的数据结构包括数组、链表、哈希表、栈和队列等。 数组:数组是一种有序的数据结构,可以快速访问元素。适合存储...
    99+
    2024-02-27
    JavaScript 代码优化、性能优化、数据结构、算法、代码结构、浏览器特性
  • JavaScript 代码优化技巧与实践:让你的代码更强大
    避免使用全局变量 全局变量的使用会带来严重的性能和安全问题。因为全局变量在整个应用程序中都是可见的,它可能会被意外修改或覆盖,导致难以调试的错误。因此,尽量避免使用全局变量,而是将变量的作用域限制在函数或模块中。 使用严格模式 ...
    99+
    2024-02-27
    JavaScript、代码优化、性能、可维护性
  • Python 代码优化技巧(一)
    分享最近看到的关于代码优化的一些技巧。 if 判断的短路特性 对于and,应该把满足条件少的放在前面,这样当对于大量判断时, 满足条件少的情况直接回导致其后其他表达式不会计算从而节约时间(因为 False and True 还是 Fa...
    99+
    2023-01-31
    代码 技巧 Python
  • python代码优化案例分析
    第一版举例:def displayNumType(num):     print num,"is",     if type(num)==type(0):         print 'an interger'     elif type(...
    99+
    2023-01-31
    案例分析 代码 python
  • 一文总结5个JavaScript代码优化技巧
    const target = {}; const handler = { get: (target, prop) => { console.log(`获取属性:${prop}`); return...
    99+
    2023-05-14
    javascript
  • JavaScript代码简化的示例分析
    这篇文章主要为大家展示了“JavaScript代码简化的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JavaScript代码简化的示例分析”这篇文章吧...
    99+
    2024-04-02
  • java实战技巧之if-else代码优化技巧大全
    目录前言技巧一:提取方法,拆分逻辑技巧二:分支逻辑提前return技巧三:枚举技巧四:函数式接口技巧五:设计模式使用技巧一:工厂模式+抽象类使用技巧二:策略模式+模板方法+工厂模式+...
    99+
    2024-04-02
  • PHP代码优化的示例分析
    这篇文章主要介绍了PHP代码优化的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一小段“劣质”的PHP代码优化的过程,请仔细体会优化...
    99+
    2024-04-02
  • PHP 代码结构优化技巧
    优化 php 代码结构的实用技巧:遵循 psr 标准以实现一致性和可读性。使用命名空间组织相关类和函数。抽取方法保持代码整洁并提高可重用性。使用注解添加元数据以提高可读性和文档化水平。优...
    99+
    2024-05-06
    php 代码优化
  • Python 代码性能优化技巧
    1. Vim2. Eclipse with PyDev3. Sublime Text4. Emacs5. Komodo Edit6. PyCharm7. Wing8. PyScripter9. The Eric Python IDE10. ...
    99+
    2023-01-31
    性能 代码 技巧
  • PHP中的代码优化技巧
    PHP是一门常用的服务器端脚本语言,用于动态网页开发。在实际开发中,我们需要保证PHP代码具有较高的性能和可扩展性,而代码优化就是实现这一目标的基本手段之一。本文将介绍PHP中的一些常用代码优化技巧,希望能够帮助PHP开发者提高代码性能和可...
    99+
    2023-05-25
    性能优化 PHP优化 代码优化
  • VS2005代码相关技巧的示例分析
    这篇文章主要为大家分析了VS2005代码相关技巧的示例分析的相关知识点,内容详细易懂,操作细节合理,具有一定参考价值。如果感兴趣的话,不妨跟着跟随小编一起来看看,下面跟着小编一起深入学习“VS2005代码相关技巧的示例分析”的知识吧。VS2...
    99+
    2023-06-17
  • Vue递归组件使用技巧实例代码分析
    这篇文章主要介绍“Vue递归组件使用技巧实例代码分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vue递归组件使用技巧实例代码分析”文章能帮助大家解决问题。痛点引出在平时的开发当中,渲染侧边栏导航...
    99+
    2023-07-05
  • webpack代码分离优化的示例分析
    这篇文章主要介绍了webpack代码分离优化的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。分离代码文件在此之前,首先要知道经常配置...
    99+
    2024-04-02
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作