精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Web性能優化:理解及使用JavaScript緩存

開發 前端
隨著我們的應用程序的不斷增長并開始進行復雜的計算時,對速度的需求越來越高,所以流程的優化變得必不可少。 當我們忽略這個問題時,我們最終的程序需要花費大量時間并在執行期間消耗大量的系統資源。

 [[260205]]

隨著我們的應用程序的不斷增長并開始進行復雜的計算時,對速度的需求越來越高(🏎️),所以流程的優化變得必不可少。 當我們忽略這個問題時,我們最終的程序需要花費大量時間并在執行期間消耗大量的系統資源。

緩存是一種優化技術,通過存儲開銷大的函數執行的結果,并在相同的輸入再次出現時返回已緩存的結果,從而加快應用程序的速度。

如果這對你沒有多大意義,那沒關系。 本文深入解釋了為什么需要進行緩存,緩存是什么,如何實現以及何時應該使用緩存。

什么是緩存

緩存是一種優化技術,通過存儲開銷大的函數執行的結果,并在相同的輸入再次出現時返回已緩存的結果,從而加快應用程序的速度。

在這一點上,我們很清楚,緩存的目的是減少執行“昂貴的函數調用”所花費的時間和資源。

什么是昂貴的函數調用?別搞混了,我們不是在這里花錢。在計算機程序的上下文中,我們擁有的兩種主要資源是時間和內存。因此,一個昂貴的函數調用是指一個函數調用中,由于計算量大,在執行過程中大量占用了計算機的資源和時間。

然而,就像對待金錢一樣,我們需要節約。為此,使用緩存來存儲函數調用的結果,以便在將來的時間內快速方便地訪問。

緩存只是一個臨時的數據存儲,它保存數據,以便將來對該數據的請求能夠更快地得到處理。

因此,當一個昂貴的函數被調用一次時,結果被存儲在緩存中,這樣,每當在應用程序中再次調用該函數時,結果就會從緩存中非常快速地取出,而不需要重新進行任何計算。

為什么緩存很重要?

下面是一個實例,說明了緩存的重要性:

想象一下,你正在公園里讀一本封面很吸引人的新小說。每次一個人經過,他們都會被封面吸引,所以他們會問書名和作者。***次被問到這個問題的時候,你翻開書,讀出書名和作者的名字。現在越來越多的人來這里問同樣的問題。你是一個很好的人🙂,所以你回答所有問題。

你會翻開封面,把書名和作者的名字一一告訴他,還是開始憑記憶回答?哪個能節省你更多的時間?

發現其中的相似之處了嗎?使用記憶法,當函數提供輸入時,它執行所需的計算并在返回值之前將結果存儲到緩存中。如果將來接收到相同的輸入,它就不必一遍又一遍地重復,它只需要從緩存(內存)中提供答案。

緩存是怎么工作的

JavaScript 中的緩存的概念主要建立在兩個概念之上,它們分別是:

  •  閉包
  •  高階函數(返回函數的函數)

閉包

閉包是函數和聲明該函數的詞法環境的組合。

不是很清楚? 我也這么認為。

為了更好的理解,讓我們快速研究一下 JavaScript 中詞法作用域的概念,詞法作用域只是指程序員在編寫代碼時指定的變量和塊的物理位置。如下代碼: 

  1. function foo(a) {  
  2.   var b = a + 2;  
  3.   function bar(c) {  
  4.     console.log(a, b, c);  
  5.   }  
  6.   bar(b * 2);  
  7.  
  8. foo(3); // 3, 5, 10 

從這段代碼中,我們可以確定三個作用域:

  •  全局作用域(包含 foo 作為唯一標識符)
  •  foo 作用域,它有標識符 a、b 和 bar
  •  bar 作用域,包含 c 標識符

仔細查看上面的代碼,我們注意到函數 foo 可以訪問變量 a 和 b,因為它嵌套在 foo 中。注意,我們成功地存儲了函數 bar 及其運行環境。因此,我們說 bar 在 foo 的作用域上有一個閉包。

你可以在遺傳的背景下理解這一點,即個體有機會獲得并表現出遺傳特征,即使是在他們當前的環境之外,這個邏輯突出了閉包的另一個因素,引出了我們的第二個主要概念。

從函數返回函數

通過接受其他函數作為參數或返回其他函數的函數稱為高階函數。

閉包允許我們在封閉函數的外部調用內部函數,同時保持對封閉函數的詞法作用域的訪問

讓我們對前面的示例中的代碼進行一些調整,以解釋這一點。 

  1. function foo(){  
  2.   var a = 2 
  3.   function bar() {  
  4.     console.log(a);  
  5.   }  
  6.   return bar;  
  7.  
  8. var baz = foo();  
  9. baz();//2 

注意函數 foo 如何返回另一個函數 bar。這里我們執行函數 foo 并將返回值賦給baz。但是在本例中,我們有一個返回函數,因此,baz 現在持有對 foo 中定義的bar 函數的引用。

最有趣的是,當我們在 foo 的詞法作用域之外執行函數 baz 時,仍然會得到 a 的值,這怎么可能呢?😕

請記住,由于閉包的存在,bar 總是可以訪問 foo 中的變量(繼承的特性),即使它是在 foo 的作用域之外執行的。

案例研究:斐波那契數列

斐波那契數列是什么?

斐波那契數列是一組數字,以1 或 0 開頭,后面跟著1,然后根據每個數字等于前兩個數字之和規則進行。如 

  1. 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … 

或者 

  1. 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, … 

挑戰:編寫一個函數返回斐波那契數列中的 n 元素,其中的序列是: 

  1. [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, …] 

知道每個值都是前兩個值的和,這個問題的遞歸解是: 

  1. function fibonacci(n) {  
  2.   if (n <= 1) {  
  3.     return 1  
  4.   }  
  5.   return fibonacci(n - 1) + fibonacci(n - 2)  

確實簡潔準確!但是,有一個問題。請注意,當 n 的值到終止遞歸之前,需要做大量的工作和時間,因為序列中存在對某些值的重復求值。

看看下面的圖表,當我們試圖計算 fib(5)時,我們注意到我們反復地嘗試在不同分支的下標 0,1,2,3 處找到 Fibonacci 數,這就是所謂的冗余計算,而這正是緩存所要消除的。

 

  1. function fibonacci(n, memo) {  
  2.   memomemo = memo || {}  
  3.   if (memo[n]) {  
  4.     return memo[n]  
  5.   }  
  6.   if (n <= 1) {  
  7.     return 1  
  8.   }  
  9.   return memo[n] = fibonacci(n-1, memo) + fibonacci(n-2, memo)  

在上面的代碼片段中,我們調整函數以接受一個可選參數 memo。我們使用 memo 對象作為緩存來存儲斐波那契數列,并將其各自的索引作為鍵,以便在執行過程中稍后需要時檢索它們。 

  1. memomemo = memo || {} 

在這里,檢查是否在調用函數時將 memo 作為參數接收。如果有,則初始化它以供使用;如果沒有,則將其設置為空對象。 

  1. if (memo[n]) {  
  2.   return memo[n]  

接下來,檢查當前鍵 n 是否有緩存值,如果有,則返回其值。

和之前的解一樣,我們指定了 n 小于等于 1 時的終止遞歸。

***,我們遞歸地調用n值較小的函數,同時將緩存值(memo)傳遞給每個函數,以便在計算期間使用。這確保了在以前計算并緩存值時,我們不會第二次執行如此昂貴的計算。我們只是從 memo 中取回值。

注意,我們在返回緩存之前將最終結果添加到緩存中。

使用 JSPerf 測試性能

可以使用些鏈接來性能測試。在那里,我們運行一個測試來評估使用這兩種方法執行fibonacci(20) 所需的時間。結果如下:

哇! ! !這讓人很驚訝,使用緩存的 fibonacci 函數是最快的。然而,這一數字相當驚人。它執行 126,762 ops/sec,這遠遠大于執行 1,751 ops/sec 的純遞歸解決方案,并且比較沒有緩存的遞歸速度大約快 99%。

注:“ops/sec”表示每秒的操作次數,就是一秒鐘內預計要執行的測試次數。

現在我們已經看到了緩存在函數級別上對應用程序的性能有多大的影響。這是否意味著對于應用程序中的每個昂貴函數,我們都必須創建一個修改后的變量來維護內部緩存?

不,回想一下,我們通過從函數返回函數來了解到,即使在外部執行它們,它們也會導致它們繼承父函數的范圍,這使得可以將某些特征和屬性從封閉函數傳遞到返回的函數。

使用函數的方式

在下面的代碼片段中,我們創建了一個高階的函數 memoizer。有了這個函數,將能夠輕松地將緩存應用到任何函數。 

  1. function memoizer(fun) {  
  2.   let cache = {}  
  3.   return function (n) {  
  4.     if (cache[n] != undefined) {  
  5.       return cache[n]  
  6.     } else {  
  7.       let result = fun(n)  
  8.       cache[n] = result 
  9.        return result  
  10.     }  
  11.   }  

上面,我們簡單地創建一個名為 memoizer 的新函數,它接受將函數 fun 作為參數進行緩存。在函數中,我們創建一個緩存對象來存儲函數執行的結果,以便將來使用。

從 memoizer 函數中,我們返回一個新函數,根據上面討論的閉包原則,這個函數無論在哪里執行都可以訪問 cache。

在返回的函數中,我們使用 if..else 語句檢查是否已經有指定鍵(參數) n 的緩存值。如果有,則取出并返回它。如果沒有,我們使用函數來計算結果,以便緩存。然后,我們使用適當的鍵 n 將結果添加到緩存中,以便以后可以從那里訪問它。***,我們返回了計算結果。

很順利!

要將 memoizer 函數應用于最初遞歸的 fibonacci 函數,我們調用 memoizer 函數,將 fibonacci 函數作為參數傳遞進去。 

  1. const fibonacciMemoFunction = memoizer(fibonacciRecursive) 

測試 memoizer 函數

當我們將 memoizer 函數與上面的例子進行比較時,結果如下:

memoizer 函數以 42,982,762 ops/sec 的速度提供了最快的解決方案,比之前考慮的解決方案速度要快 100%。

關于緩存,我們已經說明什么是緩存 、為什么要有緩存和如何實現緩存。現在我們來看看什么時候使用緩存。

何時使用緩存

當然,使用緩存效率是級高的,你現在可能想要緩存所有的函數,這可能會變得非常無益。以下幾種情況下,適合使用緩存:

  •  對于昂貴的函數調用,執行復雜計算的函數。
  •  對于具有有限且高度重復輸入范圍的函數。
  •  用于具有重復輸入值的遞歸函數。
  •  對于純函數,即每次使用特定輸入調用時返回相同輸出的函數。

緩存庫

  •  Lodash
  •  Memoizer
  •  Fastmemoize
  •  Moize
  •  Reselect for Redux

總結

使用緩存方法 ,我們可以防止函數調用函數來反復計算相同的結果,現在是你把這些知識付諸實踐的時候了。

 

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2010-05-28 10:23:59

JavaScriptWeb

2019-03-14 15:38:19

ReactJavascript前端

2014-12-10 10:12:02

Web

2022-03-02 11:13:50

Web前端開發

2017-01-06 08:51:31

2015-12-16 12:40:32

H5緩存機制移動

2019-03-05 10:20:49

WebWebpack分離數據

2015-06-23 16:36:11

Web性能優化

2012-01-10 16:22:25

Web

2015-08-17 10:35:56

Web性能優化

2013-01-22 15:27:23

WebWeb前端

2025-03-28 08:35:00

2025-02-04 10:58:16

2009-06-10 22:00:57

JavaScript腳

2009-06-11 17:15:23

JavaScript性

2012-12-24 09:55:15

JavaJava WebJava優化

2015-09-15 10:54:54

HTTP2 WEB 性能優化

2022-08-01 14:59:57

Web前端后端

2014-03-19 14:34:06

JQuery高性能

2015-09-15 10:46:29

點贊
收藏

51CTO技術棧公眾號

国产成人午夜片在线观看高清观看| 丰满少妇在线观看| 制服.丝袜.亚洲.中文.综合懂| 成人免费公开视频| 精品久久不卡| 亚洲va天堂va国产va久| 中文字幕精品一区二区精品| 亚洲理论电影在线观看| 中文字幕有码视频| 亚洲精品合集| 亚洲成a人片在线观看中文| 国产精品爽爽爽爽爽爽在线观看| 岛国精品一区二区三区| 免费大片黄在线| 日本精品在线观看| 国产日韩亚洲欧美综合| 91sa在线看| 亚洲一区和二区| 午夜激情电影在线播放| 不卡视频在线观看| 久久久久久久久91| 无码国产精品一区二区高潮| av网站大全在线观看| 午夜在线精品| 亚洲精品国产品国语在线| 国产专区在线视频| 国产av精国产传媒| 香港欧美日韩三级黄色一级电影网站| 色哟哟在线观看一区二区三区| 国产精品二区在线| 亚洲精品国产精品国自| 影视一区二区三区| 国产亲近乱来精品视频| 国产精品极品尤物在线观看 | 色av手机在线| 国模少妇一区二区三区| 日韩中文字在线| 亚洲第一狼人区| av每日在线更新| www.一区二区| 欧美综合国产精品久久丁香| 一本色道久久综合亚洲精品图片| 少妇视频在线观看| 国产偷国产偷亚洲高清人白洁| 国产成人精品自拍| 国产一区二区网站| 成人在线免费观看网站| 欧美日韩国产欧美日美国产精品| 亚洲一区二区三区加勒比| 国产精品嫩草影院精东| 欧美日韩蜜桃| 日韩国产在线看| 五月天婷婷激情视频| а√天堂资源官网在线资源| 久久影音资源网| 国产免费一区二区三区在线能观看 | 91麻豆精品一二三区在线| 国产精品第一页第二页第三页| 91精品久久久久久久久久久| 欧美日韩免费一区二区| 久久九九热re6这里有精品| 黑人巨大精品欧美一区二区一视频 | 久久超级碰视频| 欧美成人精品在线视频| 美女流白浆视频| 天天综合在线观看| 亚洲国产一区视频| 免费久久久一本精品久久区| 91九色蝌蚪91por成人| 青青草97国产精品免费观看无弹窗版 | 在线观看免费视频污| 亚洲大胆人体大胆做受1| 亚洲欧美日韩在线| 精品无人乱码一区二区三区的优势| 中文字幕高清在线免费播放| 无需播放器亚洲| 日韩精品久久久久久福利| 波多野结衣有码| 午夜不卡一区| 日韩一区二区视频| 黑人粗进入欧美aaaaa| 成人看片在线观看| 欧美日产国产精品| 在线观看免费看片| 噜噜噜天天躁狠狠躁夜夜精品| 亚洲成人av中文字幕| 欧美成人福利在线观看| 欧美日韩国产观看视频| 欧美性xxxx极品hd满灌| 国产 欧美 日本| 成人黄色动漫| 日本高清不卡aⅴ免费网站| 久久天天东北熟女毛茸茸| 日韩xxx视频| 亚洲国产免费| 日韩在线视频网站| 午夜福利三级理论电影| 欧美尿孔扩张虐视频| 欧美视频一区二区| 99久久国产综合精品五月天喷水| 欧美一级做性受免费大片免费| 九九**精品视频免费播放| 91精品综合久久久久久五月天| 国产在线视频第一页| 少妇精品久久久| 日韩欧美在线网站| 久久久高清视频| 欧美日韩在线精品一区二区三区激情综合 | 精品国产亚洲在线| 欧美 国产 日本| 草草影院在线观看| 中文字幕中文字幕中文字幕亚洲无线 | 日韩精品免费在线观看| 超碰人人人人人人人| 一区二区三区欧洲区| 欧美探花视频资源| xxx中文字幕| 97精品国产99久久久久久免费| 天天做天天摸天天爽国产一区| 法国空姐在线观看免费| 9色在线观看| 亚洲视频在线一区二区| 香港三级韩国三级日本三级| 久久77777| 中文字幕欧美日本乱码一线二线 | 国产性生活免费视频| 大桥未久在线视频| 欧美日韩一区不卡| 国产成人在线小视频| 91视频在线观看| 精品久久久一区| 伊人色在线视频| 色综合.com| 日韩精品极品在线观看播放免费视频 | 精品亚洲aⅴ无码一区二区三区| 自拍视频亚洲| 亚洲人成五月天| 日韩xxx高潮hd| 婷婷亚洲最大| 日韩免费观看高清| 日韩黄色在线播放| 国产一区二区三区香蕉| 91久久久国产精品| 久热av在线| 91免费在线播放| 免费高清一区二区三区| 成人自拍av| 欧美日韩激情网| 四虎国产精品永久免费观看视频| 日韩电影免费网址| 在线成人免费网站| 日韩一区二区视频在线| 亚洲精品日韩久久| 91精品婷婷国产综合久久蝌蚪| 亚洲精品911| 中文字幕亚洲精品在线观看| 成人午夜免费在线视频| 日韩五码电影| 亚洲全黄一级网站| 西西44rtwww国产精品| 成人性视频免费网站| 成人免费观看网站| 超碰人人在线| 亚洲v中文字幕| 国产aⅴ爽av久久久久| 日韩精品1区| 国产精品久久久久久久电影| 国产在线日本| 欧美日韩在线视频一区| 黄色污在线观看| 日本亚洲不卡| 久久人人爽人人爽人人片av高请| 97成人在线观看| 亚洲狼人国产精品| 日韩欧美精品免费| jizzjizzjizz欧美| 精品亚洲一区二区三区在线观看| 欧美日韩大片在线观看| 国产中文一区| 国产偷久久久精品专区| 欧美女子与性| 一本到不卡免费一区二区| 亚洲av毛片基地| 久久精品免费观看| 成人动漫视频在线观看免费| 特黄视频在线观看| 国产精品美女久久久久aⅴ| 999精品网站| 6080亚洲理论片在线观看| 九九热最新视频//这里只有精品| 影音先锋在线国产| 久久网站最新地址| 日本wwww视频| 日韩精品一卡| 国产精品xxx在线观看www| 高清在线视频不卡| 亚洲免费一在线| 国产成人在线网址| 国产一区二区女| 成品人视频ww入口| 香蕉人人精品| 国产日产欧美a一级在线| 欧美a在线看| 精品黑人一区二区三区久久 | 午夜精品无码一区二区三区| 国产亚洲欧美中文| 狠狠干狠狠操视频| 国产一区视频在线观看免费| 精品视频导航| 亚洲免费一区| 91国语精品自产拍在线观看性色 | 韩国日本一区| 亚洲国产精品字幕| 91亚洲国产成人精品一区| 亚洲一区中文日韩| 亚洲午夜久久久久久久国产| 欧美福利在线| 亚洲xxxxx性| 欧美一级鲁丝片| 中文字幕日本精品| 亚洲第一页在线观看| 色综合久久久网| 日日骚一区二区三区| 久久午夜电影网| 在线播放国产视频| 日本不卡123| www插插插无码视频网站| 日本一区二区在线看| 99se婷婷在线视频观看| 桃花岛成人影院| 欧美激情一区二区三区成人| 最新97超碰在线| 亚洲国模精品一区| 国产丝袜在线视频| 中文字幕欧美日本乱码一线二线| 日本美女久久久| 日本美女一区二区三区| 青青草精品视频在线| 亚洲精品va| 日韩电影在线播放| 精品久久99| 日本91av在线播放| av男人的天堂在线观看| 精品国内片67194| 国产精品老熟女视频一区二区| 91成人免费网站| 日日操免费视频| 91麻豆国产在线观看| 国产精品久久久久久在线观看| 视频一区二区三区在线| 亚洲一区二区三区色| 亚洲精品亚洲人成在线| 国产精品久久久久免费| 国产情侣一区在线| 欧美国产日韩视频| 黄色在线免费| 日韩在线中文字| 888av在线| 精品国产一区二区三区久久狼5月| 青青久在线视频免费观看| 欧美性猛交xxxxxx富婆| 免费看毛片网站| 高跟丝袜一区二区三区| 99视频在线看| 久久综合国产精品| 日本女人性视频| 高潮精品一区videoshd| 妺妺窝人体色777777| 国内精品美女在线观看| www.激情网| 欧美私人啪啪vps| 成人免费在线视频播放| 国产主播精品| 国产69精品久久久久999小说| 99精品国产在热久久婷婷| 国产原创中文在线观看| 精品久久久中文字幕| 日韩区国产区| 日韩电影二区| 久久免费视频2| 成人av资源网址| 91视频国产精品| crdy在线观看欧美| 91福利视频导航| 国产精品45p| 成人欧美一区二区三区在线| 95精品视频| 99精品国产高清在线观看| 一区二区三区高清在线观看| 5566中文字幕一区二区| 欧美美女啪啪| 日产精品久久久一区二区| 精品国产网站| 日本丰满少妇黄大片在线观看| 影音先锋日韩在线| 欧美a级黄色大片| 日韩一级大片| 精品少妇无遮挡毛片| 精品在线免费观看| 亚洲一二三四五| 91亚洲精品久久久蜜桃| 国产熟妇久久777777| 国产精品久久久久久久久久久免费看 | 亚洲理论电影网| 黄色动漫在线免费看| 青青草国产精品97视觉盛宴 | 国产在线不卡一卡二卡三卡四卡| 人妻体体内射精一区二区| 国产99久久久国产精品| 我和岳m愉情xxxⅹ视频| 自拍偷自拍亚洲精品播放| 欧美黑吊大战白妞| 欧美日韩在线不卡| 高清一区二区三区四区| 国产一区二区三区高清在线观看| 亚洲第一天堂影院| 亚洲午夜久久久影院| 中文字幕有码在线观看| www欧美日韩| 成年人视频免费在线播放| 国产福利精品视频| 在线综合色站| 亚洲欧洲久久| 最新国产拍偷乱拍精品| 国产视频1区2区3区| 久久免费精品国产久精品久久久久| 国产一二三区精品| 国产精品久久久久久久久晋中| 亚洲激情视频一区| 欧美日韩国产高清一区二区| 天天操天天干天天| 欧美福利视频在线| 国产精品99| 免费一区二区三区在在线视频| 中文精品电影| 杨幂毛片午夜性生毛片| 99久久综合狠狠综合久久| 欧美日韩免费做爰视频| 欧美片在线播放| 九一国产在线| 97av在线视频免费播放| 亚洲三级av| 中文字幕一区二区三区精彩视频| 亚洲一区二区毛片| 欧美精品色婷婷五月综合| 国产成人精品综合在线观看| 一级免费黄色录像| 欧美在线不卡视频| 免费在线一级视频| 久久97久久97精品免视看| 欧美第一在线视频| 中文字幕一区二区三区在线乱码 | 欧美性色欧美a在线播放| www.xxxx国产| xxxxx成人.com| 性高爱久久久久久久久| 美女亚洲精品| 国产一区二区精品| 看全色黄大色黄女片18| 亚洲欧洲精品天堂一级| 92久久精品一区二区| 中文字幕在线精品| 国产在线|日韩| 日韩福利在线| 轻轻草成人在线| 无码h肉动漫在线观看| 黑人精品xxx一区一二区| 艳母动漫在线看| 欧美亚洲第一页| 综合色就爱涩涩涩综合婷婷| www.日本在线视频| 91视频免费播放| 中文字幕av影院| 亚洲性xxxx| www.久久.com| 艳色歌舞团一区二区三区| 日本va欧美va精品发布| 成年人在线免费看片| 在线精品观看国产| 91涩漫在线观看| 成人高h视频在线| 你懂的成人av| 中出视频在线观看| 色欧美片视频在线观看| 成人高清在线| 成人黄色影片在线| 综合av在线| 亚洲国产果冻传媒av在线观看| 五月开心婷婷久久| 精品欧美不卡一区二区在线观看| 国产高清在线不卡| 午夜精品剧场| 欧美 日本 国产| 欧美中文字幕一区| 国产调教视频在线观看| 国产欧美日韩一区二区三区| 日韩精品三区四区| 黄视频网站免费看| 日韩电影在线观看中文字幕| 日本精品另类|