Javascript性能优化【内联缓存】 V8引擎特性

杨周龙 2021-02-23 14:55:27
优化 javascript 性能 缓存 内联


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

什么是内联缓存

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

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

转换成代码

模拟计算逻辑(伪代码)
为了更好提现出现内联缓存的优化,我们把对象所有方法逻辑为一致。
 let value = 0
const 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)
else
Calculator.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的
版权声明
本文为[杨周龙]所创,转载请带上原文链接,感谢
https://segmentfault.com/a/1190000039261510

  1. Golang 实现 Redis(9): 使用GeoHash 搜索附近的人
  2. RxHttp - 轻量级、可扩展、易使用、完美兼容MVVM、MVC架构的网络封装类库
  3. Golang realizes redis (9): using geohash to search nearby people
  4. Rxhttp - lightweight, extensible, easy to use, perfectly compatible with MVVM, MVC architecture network encapsulation class library
  5. Golang realizes redis (9): using geohash to search nearby people
  6. Rxhttp - lightweight, extensible, easy to use, perfectly compatible with MVVM, MVC architecture network encapsulation class library
  7. 读懂框架设计的灵魂 — Java 反射机制
  8. 治疗磁盘空间不足焦虑症,释放容器占用空间——Win10+docker篇
  9. 别再用jodatime了!全网最权威Java8日期时间类LocalDate、LocalDateTime详解
  10. Understanding the soul of framework design java reflection mechanism
  11. 配置客户端以安全连接到Apache Kafka集群4:TLS客户端身份验证
  12. Treating anxiety of insufficient disk space and releasing space occupied by containers -- win10 + docker
  13. Don't use jodatime any more! The most authoritative java 8 date and time classes in the whole network: detailed explanation of localdate and localdatetime
  14. Configure clients to connect securely to Apache Kafka Cluster 4: TLS client authentication
  15. Spring break
  16. 高性能MySQL(三):Schema与数据类型优化
  17. High performance mysql (3): schema and data type optimization
  18. redis解决缓存、击穿、雪崩
  19. redis
  20. 骑士卡:基于Kafka搭建消息中心,上亿消息推送轻松完成
  21. Redis solves cache, breakdown and avalanche
  22. redis
  23. Knight card: build a message center based on Kafka, and push hundreds of millions of messages easily
  24. Oracle OCP 19c 认证1Z0-083考试题库(第2题)
  25. redis的三种模式
  26. kubernetes和docker----2.学习Pod资源
  27. 谈一谈如何远程访问MySQL(腾讯云,云主机)
  28. Linux(五):Linux的文档编辑器Vi
  29. Oracle OCP 19C certification 1z0-083 examination question bank (question 2)
  30. 云原生项目实践DevOps(GitOps)+K8S+BPF+SRE,从0到1使用Golang开发生产级麻将游戏服务器—第6篇
  31. kubernetes和docker----2.学习Pod资源
  32. JSP基于Java开发Web应用程序特点有哪些?
  33. Three modes of redis
  34. Kubernetes and docker -- 2. Learning pod resources
  35. Linux (5): the document editor VI of Linux
  36. Cloud native project practice Devops (gitops) + k8s + BPF + SRE, using golang to develop production level mahjong game server from 0 to 1
  37. Kubernetes and docker -- 2. Learning pod resources
  38. What are the characteristics of JSP developing web application based on Java?
  39. Lottie error: java.lang.AssertionError : android.util.JsonReader .peek
  40. Rxhttp - lightweight, extensible, easy to use, perfectly compatible with MVVM, MVC architecture network encapsulation class library
  41. docker入门到熟练
  42. Java之HTTP网络编程(一):TCP/SSL网页下载
  43. Introduction to docker
  44. HTTP network programming in Java (1): TCP / SSL web page download
  45. mysql 的ACID以及隔离级别
  46. Acid and isolation level of MySQL
  47. Java序列化对字段名的影响
  48. The influence of Java serialization on field names
  49. Redis 日志篇:系统高可用的杀手锏
  50. Java中把一个对象复制给另外一个对象引发的思考
  51. Java之HTTP网络编程(一):TCP/SSL网页下载
  52. Redis log: the killer of system high availability
  53. Thinking about copying one object to another in Java
  54. HTTP network programming in Java (1): TCP / SSL web page download
  55. 数据库--oracle安装配置(本地安装的步骤及各种问题解决方案)
  56. 从事Java9年,27天熬夜把近年遇到的面试题收录成册全网开源!
  57. Database -- Oracle installation configuration (local installation steps and various problem solutions)
  58. Engaged in Java for 9 years, 27 days stay up late, the interview questions encountered in recent years included into a volume, the whole network open source!
  59. Java序列化 / 调用 Wildfly 服务接口异常:EJBCLIENT000409
  60. docker-compose部署Estack