javascript 是单线程、动态类型语言,那么我们在编码时候如何编写性能最优代码呢?下面将讲解V8引擎的内联优化。利用内联缓存这个特性我们可以编写更加优秀的代码。

什么是内联缓存

引用官方的描述:内联缓存(Inline caching)是部分编程语言的运行时系统采用的优化技术,最早为Smalltalk开发。内联缓存的目标是通过记住以前直接在调用点上方法查询的结果来加快运行时方法绑定的速度。内联缓存对动态类型语言尤为有用,其中大多数(如非全部)方法绑定发生在运行时,因此虚方法表通常无法使用。

  • 我们可以理解为javascript每一次的栈执行遇到调用外部函数、对象时候都产生地址缓存记录,下回执行到这个位置时候直接从缓存中取出对应记录,省去重新查找这一过程从加快程序执行速度。

转换成代码

模拟计算逻辑(伪代码)

为了更好提现出现内联缓存的优化,我们把对象所有方法逻辑为一致。

        let value = 0const Calculator = {add1(val) {value += val},add2(val) {value += val},add3(val) {value += val},add4(val) {value += val},add5(val) {value += val},add6(val) {value += val},add7(val) {value += val},add8(val) {value += val},add9(val) {value += val},add10(val) {value += val}}

####### 不实用内联优化策略的代码

     function notOptimization(val, type) {Calculator[type](val) // 动态执行函数,当前调点无法确定地址}const CalculatorKey = Object.keys(Calculator)console.time('notOptimization')for(let i = 0; i < 1000000; i ++) {const key = CalculatorKey[Math.floor(Math.random() * CalculatorKey.length)]notOptimization(1, key)}console.timeEnd('notOptimization')

上面这段代码使用哈希快速查找对应函数,但是放弃内联缓存策略。代码5次执行结果,平均为80ms左右

####### 使用内联缓存策略代码

        function optimization(val, type) {if (type === 'add1')Calculator.add1(val)else if (type === 'add2')Calculator.add2(val)else if (type === 'add3')Calculator.add3(val)else if (type === 'add4')Calculator.add4(val)else if (type === 'add5')Calculator.add5(val)else if (type === 'add6')Calculator.add6(val)else if (type === 'add7')Calculator.add7(val)else if (type === 'add8')Calculator.add8(val)else if (type === 'add9')Calculator.add9(val)elseCalculator.add10(val)}const CalculatorKey = Object.keys(Calculator)console.time('optimization')for(let i = 0; i < 1000000; i ++) {const key = CalculatorKey[Math.floor(Math.random() * CalculatorKey.length)]optimization(1, key)}console.timeEnd('optimization')

这段代码用了多层if else 进行函数调用(为了提现内联缓存策略的优化,正确应该用switch或数组查找),我们看看执行5次结果,速度为55~50ms

总结,所以在编码过程我们尽量少使用动态调用运算,但是相对对象属性值获取哈希、数组的方式是远远快于if、switch的

Javascript性能优化【内联缓存】 V8引擎特性相关推荐

  1. javascript性能优化

    2019独角兽企业重金招聘Python工程师标准>>> 很久就想总结一下关于javascript性能优化方面的一些东西,平时也有注意收集这方面的资料.把del.icio.us里的收藏 ...

  2. Yii2性能优化之:缓存依赖

    Yii2性能优化之:缓存依赖 Yii中的缓存依赖,简单来说就是将缓存和另外一个东西绑定在一起,如果另外一个东西发生变化,那么缓存也将发生变化.有点儿类似于JS中的触发事件(但是也不那么像),缓存的变动 ...

  3. Oracle性能优化 以及 库缓存命中率及等待事件

    http://www.cnblogs.com/hyddd/archive/2009/08/30/1556939.html 前言 最近hyddd一直看Oracle的资料,今天特地总结一下这段时间了解到的 ...

  4. C++应用程序性能优化(三)——C++语言特性性能分析

    C++应用程序性能优化(三)--C++语言特性性能分析 一.C++语言特性性能分析简介 通常大多数开发人员认为,汇编语言和C语言比较适合编写对性能要求非常高的程序,C++语言主要适用于编写复杂度非常高 ...

  5. 性能优化之页面缓存(以Javascript方式缓存页面部件)

    本篇文章为大家讲解一个关于客户端缓存页面的技巧--以Javascript的方式来缓存页面的静态"部件". 如果整个页面能够被缓存到浏览器上,一个满载HTML的巨大页面也能运行地很棒 ...

  6. JavaScript 深度剖析 - JavaScript 性能优化

    文章目录 一.性能优化介绍 二.JavaScript 内存管理(Memory Management) 2.1 内存管理介绍 2.2 JavaScript 中的内存管理 三.JavaScript 中的垃 ...

  7. JavaScript性能优化详解

    性能优化介绍 性能优化是不可避免的 无处不在的前端性能优化 function func(){arr = []arr[100000] = 'lg is a dog' } func() JavaScrip ...

  8. JavaScript 性能优化杀手

    原址:http://web.jobbole.com/83582/?utm_source=blog.jobbole.com&utm_medium=relatedPosts 引言 这篇文档包含了如 ...

  9. [译] JavaScript 性能优化杀手

    原文:http://dev.zm1v1.com/2015/08/19/javascript-optimization-killers/ 引言 这篇文档包含了如何避免使代码性能远低于预期的建议. 尤其是 ...

最新文章

  1. python默认的一个代码缩进是几个空格_python缩进长度是否统一
  2. Python Logging模块实现运行的程序写入 日志
  3. AI来编程,码农何去何从?
  4. sqlalchemy1.4风格2.0
  5. PHP设计模式之装饰者模式
  6. 将Excle数据导入到数据库
  7. 中文实体、关系抽取工具
  8. (九)模型驱动和属性驱动
  9. ubuntu server执行sudo出现no talloc stackframe at ../source3/param/loadparm.c:4864, leaking memory...
  10. 提高CIFAR-10分类准确度的方法
  11. linux中文显示和输入
  12. Java 集合中的快速失败(fail-fast)和安全失败(fail-safe)机制
  13. 面向对象的数据库db4o: 安装并使用db4o
  14. 1.1 电 电流 电压 电路 基本电子元件
  15. 联想G480黑苹果试玩纪录
  16. 11种绕过CDN查找真实IP方法(查找网站真实IP地址、查找域名真实IP)
  17. OSChina 周六乱弹 —— 我媳妇是条蛇
  18. Android换肤功能实现与换肤框架QSkinLoader使用方式介绍
  19. NP管理器 NPManager v3.0.49 安卓APK逆向反编译工具
  20. calibre(电子书管理)软件的使用

热门文章

  1. python字符串类型_Python3的字符串类型(疯狂Python)
  2. datatable怎么根据两列分组_公司要IT转型,我该怎么办?用Python进行数据处理
  3. linux qt手册,明远智睿I.MX6 Linux-4.1.15 QT5 程序编译手册
  4. 微软发动图明示新一代操作系统Windows 11
  5. windows7系统内存占用过高的解决方法
  6. 腾讯视频app官方下载_腾讯视频怎么快进
  7. 字符串处理,查询第一个不是 0 的字符的位置
  8. 实现多个下拉框同一批option,选中其一其他框里去除选中的项(不可选择已选过的项)--js
  9. 百度自动推送html5,百度暂停 JS 代码自动推送功能,代码是否需要删除?
  10. Java JDBC篇2——JDBC增删查改