Javascript性能优化【内联缓存】 V8引擎特性
javascript 是單線程、動(dòng)態(tài)類型語言,那么我們在編碼時(shí)候如何編寫性能最優(yōu)代碼呢?下面將講解V8引擎的內(nèi)聯(lián)優(yōu)化。利用內(nèi)聯(lián)緩存這個(gè)特性我們可以編寫更加優(yōu)秀的代碼。
什么是內(nèi)聯(lián)緩存
引用官方的描述:內(nèi)聯(lián)緩存(Inline caching)是部分編程語言的運(yùn)行時(shí)系統(tǒng)采用的優(yōu)化技術(shù),最早為Smalltalk開發(fā)。內(nèi)聯(lián)緩存的目標(biāo)是通過記住以前直接在調(diào)用點(diǎn)上方法查詢的結(jié)果來加快運(yùn)行時(shí)方法綁定的速度。內(nèi)聯(lián)緩存對動(dòng)態(tài)類型語言尤為有用,其中大多數(shù)(如非全部)方法綁定發(fā)生在運(yùn)行時(shí),因此虛方法表通常無法使用。
- 我們可以理解為javascript每一次的棧執(zhí)行遇到調(diào)用外部函數(shù)、對象時(shí)候都產(chǎn)生地址緩存記錄,下回執(zhí)行到這個(gè)位置時(shí)候直接從緩存中取出對應(yīng)記錄,省去重新查找這一過程從加快程序執(zhí)行速度。
轉(zhuǎn)換成代碼
模擬計(jì)算邏輯(偽代碼)
為了更好提現(xiàn)出現(xiàn)內(nèi)聯(lián)緩存的優(yōu)化,我們把對象所有方法邏輯為一致。
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}}####### 不實(shí)用內(nèi)聯(lián)優(yōu)化策略的代碼
function notOptimization(val, type) {Calculator[type](val) // 動(dòng)態(tài)執(zhí)行函數(shù),當(dāng)前調(diào)點(diǎn)無法確定地址}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')上面這段代碼使用哈希快速查找對應(yīng)函數(shù),但是放棄內(nèi)聯(lián)緩存策略。代碼5次執(zhí)行結(jié)果,平均為80ms左右
####### 使用內(nèi)聯(lián)緩存策略代碼
這段代碼用了多層if else 進(jìn)行函數(shù)調(diào)用(為了提現(xiàn)內(nèi)聯(lián)緩存策略的優(yōu)化,正確應(yīng)該用switch或數(shù)組查找),我們看看執(zhí)行5次結(jié)果,速度為55~50ms
總結(jié),所以在編碼過程我們盡量少使用動(dòng)態(tài)調(diào)用運(yùn)算,但是相對對象屬性值獲取哈希、數(shù)組的方式是遠(yuǎn)遠(yuǎn)快于if、switch的
總結(jié)
以上是生活随笔為你收集整理的Javascript性能优化【内联缓存】 V8引擎特性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 服务器故障英文邮件,服务器一般故障排除(
- 下一篇: mysql字段是否存在_Mysql判断表