javascript是一种单线程、动态类型的语言,那么我们在编码时如何编写出性能最优的代码呢?下面将讲解V8引擎的内联优化。使用内联缓存的特性我们可以写出更好的代码。什么是内联缓存参考官方描述:内联缓存(Inlinecaching)是一些编程语言运行时系统使用的一种优化技术,最早是为Smalltalk开发的。内联缓存的目标是通过直接在调用站点记住先前方法查询的结果来加速运行时的方法绑定。内联缓存对于动态类型语言特别有用,其中大多数(如果不是全部)方法绑定发生在运行时,因此虚拟方法表通常不可用。我们可以这样理解,javascript栈执行每次遇到外部函数和对象的调用,都会产生地址缓存记录,下次执行到这个位置时,直接从缓存中取出对应的记录,省去了重新查找这个进程来加速程序执行。速度。将其转换成代码来模拟计算逻辑(伪代码)。为了更好的实现内联缓存的优化,我们让对象的所有方法在逻辑上保持一致。letvalue=0constCalculator={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}}不应用内联优化策略函数的代码notOptimization(val,type){Calculator[type](val)//动态执行函数,当前调用point无法确定地址}constCalculatorKey=Object.keys(Calculator)console.time('notOptimization')for(leti=0;i<1000000;i++){constkey=CalculatorKey[Math.floor(Math.random()*CalculatorKey.length)]notOptimization(1,key)}console.timeEnd('notOptimization')上面代码使用hash快速找到对应的函数,但放弃内联缓存策略代码5次执行结果,平均为80ms左右使用内联存储策略代码functionoptimization(val,type){if(type==='add1')Calculator.add1(val)elseif(type==='add2')Calculator.add2(val)elseif(type==='add3')Calculator.add3(val)elseif(type==='add4')Calculator.add4(val)elseif(type==='add5')Calculator.add5(val)elseif(type==='add6')Calculator.add6(val)elseif(type==='add7')Calculator.add7(val)elseif(type==='add8')Calculator.add8(val)elseif(type==='add9')Calculator.add9(val)elseCalculator.add10(val)}constCalculatorKey=Object.keys(Calculator)console.time('优化')for(让i=0;i<1000000;i++){constkey=CalculatorKey[Math.floor(Math.random()*CalculatorKey.length)]optimization(1,key)}console.timeEnd('optimization')这段代码使用了多层ifelse进行函数调用(为了优化内联缓存策略,正确,应该用switch或者arraysearch),先看执行5次的结果,速度是55-50ms,所以我们在编码过程中尽量少用动态调用操作,但是获取hashes和arrays的方法相对给对象属性值远比if和switch快很多
