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

性能分析不一定得用 Profiler,復雜度分析也行

開發 前端
可以做耗時分析、內存占用的的分析。可以用 chrome devtools 的 Profiler,包括 performance 和 memory,分別拿到耗時和內存占用的數據,而且還可以用火焰圖做可視化分析。

[[430592]]

如果提到性能分析,你會想到什么呢?

可以做耗時分析、內存占用的的分析。可以用 chrome devtools 的 Profiler,包括 performance 和 memory,分別拿到耗時和內存占用的數據,而且還可以用火焰圖做可視化分析。

比如 performance,你可以看到每個函數的耗時,通過簡單的加減法,就能算出是哪個函數耗時多,然后去優化。

而且,你可以勾選 memory,顯示堆內存的變化,可以知道是哪個函數導致的內存增多,然后去優化。

當然,你也可以單獨分析 memory 的 timeline,錄制一段時間的內存占用情況,然后看這時候的內存中有哪些對象,這樣比只知道大小更精確一些。

總之,我們可以通過調試工具的 Profiler 來看到內存和耗時,然后關聯到具體的函數,之后著手去優化。

但是,這些都是代碼跑起來才能統計的,而且與機器、不同的輸入數據等強相關。

如果換一臺機器,數據就是另一個樣子了。這也是為啥測試的時候要用各種機器測一遍。

那如果想代碼不運行就能估算出具體時間和內存占用大小,有什么思路么?

這就是復雜度分析技術做的事情了。

這篇文章我們來學下復雜度分析是如何估算時間的。

復雜度分析的幾個基礎

什么是 1,什么是 n

如果有這樣一行代碼:

  1. const name = 'guang'

耗時多少,內存多少?

你可能說得跑跑看,可能耗時 1ms,內存 4 bytes,也可能耗時 2ms,內存 8bytes 等等,不同的機器和運行環境都會有不同。

但我們都把它作為 1 ,這個 1 不是 ms,不是 byte,只是說是一個耗時/內存占用的基本單元,也就是復雜度是 1。

那這樣的代碼呢?

  1. function calc(n) { 
  2.     for(let i = 0; i < n; i ++) { 
  3.         //... 
  4.     } 

具體的數值隨著 n 的增大而增大,復雜度是 n。

我們分析復雜度的時候,不會分析具體的耗時和內存占用,而是以語句作為復雜度的單元,也就是 1,隨著輸入的數據規模 n 而變化的復雜度作為 n。

漸進的時候,常數可省略

我們知道了 1 和 n,就可以計算這些復雜度了:

  1. function func(n) { 
  2.     const a = 1; 
  3.     const b = 2; 
  4.      
  5.     for (let i = 0; i < n; i ++) { 
  6.        //... 
  7.     } 

這里面有兩條語句,復雜度是 1 + 1,一個循環 n 次的語句,復雜度是 n,所以總復雜度是 2 + n。

  1. 復雜度(func) = 2 + n 

當這個 n 逐漸變大的時候,比如 n 變成了 10000000,那這個 2 就可以忽略不計了。

也就是

  1. 復雜度(func) =  O(n) 

這個 O 是漸進復雜度的意思,也就是漸漸的增大的時候的復雜度。

有的同學說,這里是 2,所以可以省略,如果這里有 100000 條呢?是不是就不能省略了?

其實也會省略,因為不管多大,它的復雜度總是一個常數,是固定的,不會變化,所以不用分析進去,估算出的耗時或者內存占用加上它那固定的部分就可以了。而變化的部分才需要分析。

當我們計算漸進復雜度 O 的時候,常數會省略掉,因為它是固定的,不會變,而我們只分析變化的部分,也就是與 n 有關的部分。

多個變化的輸入數據規模時,都要計算

上面只是有一個輸入數據,規模是 n 的時候,復雜度與 n 有關。

如果有兩個輸入數據,規模分別為 m 和 n 的時候,那都要計算上,不能省略,因為都是變化的。

也就是 O(m + n)、 O(m * n) 這種。

一些常見的時間復雜度

我們明白了什么是 1,什么是 n,什么時候要同時計算 m 和 n,什么是漸進復雜度,為什么常數可以省略之后,就可以看一些實際的復雜度的例子了。

其實復雜度也就這么幾種:O(n)、O(n^2)、O(logn)、O(2^n)、O(n!)

O(n)

  1. function func(n) { 
  2.     const a = 1; 
  3.     for(let i = 0; i < n; i ++) { 
  4.         //... 
  5.     } 

這種就是 O(n),我們上面分析過。常數復雜度省略掉。

O(n^2) O(n^3)

  1. function func(n) { 
  2.     for(let i = 0; i < n; i ++) { 
  3.         for(let j = 0; j < n; j ++) { 
  4.             //... 
  5.         } 
  6.     } 

這種就是 O(n^2),同理,O(n^3)、O(n^4)等也一個意思,就是嵌套的時候,復雜度相乘。

O(logn)

  1. let n = 100;  
  2. let i = 1;  
  3. while(i < n){  
  4.     i = i * 2  

這段代碼要計算多少次,要看 i 乘以幾次 2 才大于 100,也就是 log2n

那同理,也有 log3n,log4n 等復雜度,當漸進復雜度的時候,常數是不用計算的,所以都是 O(logn)

o(2^n) o(3^n)

  1. const fibnacci = function (n) {  
  2.     if (n <= 1) return n;  
  3.     return fibnacci(n - 1) + fibnacci(n - 2); 
  4. }; 

斐波那契數列我們都知道,可以用上面的遞歸來算。

這樣算的話,n 每加 1,就多遞歸調用了 2 次 fibnacci 函數,也就是復雜度乘以 2 了,所以復雜度是 O(2^n)。

同理,如果 n 每加一,多遞歸執行 3 次,那就是 O(3^n) 的復雜度。

也就是說,n 每加一,多遞歸 a 次,那復雜度就是 O(a^n)。

O(n!)

  1. function func(n) {  
  2.     for(let i=0; i<n; i++) {  
  3.         func(n-1);  
  4.     } 

上一條我們知道了,n 每加 1,多遞歸常數次,是指數型,那如果如果當 n 每加 1,多遞歸 n 次,這種就是復雜度 o(n!) 了。

為什么不是 O(n^n) 呢?因為 n 是變化的啊,所以是 O(n!)。

這基本是全部的時間復雜度情況了。當然,這里只是討論了 n 一個緯度,再多一個緯度 m 的話,也是一樣。

下面我們來區分一下這些時間復雜度的優劣。

時間復雜度的優劣對比

我們學習了大 O 的漸進時間復雜度表示法,就是為了估算 n 與具體執行時間的關系。上面分析出的幾種時間復雜度,它們與具體執行時間的關系是什么樣的呢?可以畫出變化函數來分析。

可以看到,隨著 n 的增大, O(n!) 和 O(2^n) 是耗時增加最快的,也就是說,這樣的代碼,n一旦大了,立馬會卡死,不用跑我們就能分析出來。

那什么樣是的不容易卡死的呢?O(n)、O(nlogn)、o(logn)這種,隨著數據規模的增大,耗時也不會增大很多。

所以我們說:

  • O(n!)、O(2^n) 的時間復雜度都是特別高的,是不好的,是要避免的。
  • O(n)、O(nlogn)、O(logn) 的時間復雜度是比較低的,是好的,是要盡量采用的。

根據這個結論,我們就可以評判一些代碼寫法的好壞,也就是算法的優劣了。

需要真實去跑代碼么?不需要。

空間復雜度

空間復雜度也就是堆棧內存的分配與輸入數據規模 n 的關系。

這里不包括全局變量,為什么呢?全局變量不會動態變啊,就相當于常數,可以省略,只分析變化的堆棧內存的復雜度就好了。

空間復雜度的分析方式和時間復雜度是類似的,只是不是把每一條語句作為 1,而是只把會分配內存的語句作為 1 來分析。

比如下面這段代碼的空間復雜度就是 O(n)。

  1. function func(n) { 
  2.     let arr = []; 
  3.     for (let i = 0; i < n; i++) { 
  4.         arr.push(i); 
  5.     } 

總結

分析性能一般通過運行時的 Profiler 來收集數據,然后分析耗時和內存占用,比如 chrome devtoos 的 performance 和 memory 工具。

但是其實不用運行代碼,我們也可以通過復雜度來估算出來:

我們把一條語句作為復雜度是 1,而隨著輸入數據規模 n 變化的為復雜度 n。

我們估算是為了分析出耗時/內存占用隨著數據規模 n 的一個變化關系,所以會用 O(n) 來表達這種變化關系,叫做漸進時間復雜度。

求漸進時間復雜度時,常數可以省略,因為它們是固定不變的,而我們只需要分析變化的部分。

復雜度基本就 O(n) O(logn) O(n^2) O(2^n) O(n!) 這幾種。

其中要注意的是 O(2^n) 就是當 n 每加一,多遞歸 2 次,而如果 n 每加 1,多遞歸 n 次,那么就是 O(n!) 的復雜度。

O(2^n) 和 O(n!) 的復雜度都是隨著 n 增加,復雜度急劇增加的,也就是耗時/內存占用會急劇增加,這樣的代碼很容易卡死,所以是不好的。

而 O(logn) O(n) 都是隨著 n 增加,復雜度增加很少的。也就意味了耗時更少,內存占用更少。這樣的算法當然也就更好了。

所以我們就是通過復雜度來評價算法好壞的,它就代表了耗時/內存占用,但不是直接表示的,而是抽象的表示。

如果說想得到不同機器、環境下的具體耗時/內存占用,那么就用 Profiler 在運行時收集數據,然后做分析和可視化,否則,其實通過復雜度就能夠抽象的估算出來大概的耗時和內存占用。

性能分析不一定得用 Profiler,復雜度分析也行,它能評價一個代碼寫法(算法)的好壞,進而估算出性能。

 

責任編輯:姜華 來源: 神光的編程秘籍
相關推薦

2020-08-30 14:31:40

Python編程語言開發

2021-02-26 09:04:22

數組ArrayListHashMap

2023-10-30 01:08:35

微信紅包高性能架構

2022-12-26 09:16:45

Guava架構模型

2016-11-28 11:19:48

術語神秘

2018-12-18 10:11:37

軟件復雜度軟件系統軟件開發

2018-03-09 10:34:48

顯卡參數超頻

2018-01-18 05:20:59

2017-01-19 17:57:47

大數據

2018-02-08 09:11:25

Linux命令rm

2011-01-12 18:38:25

2022-09-06 15:35:01

開源軟件OSS

2020-11-30 06:26:31

算法時間表示法

2009-04-08 08:57:09

鴻海郭臺銘職場出牌學

2013-08-14 18:25:28

2024-07-11 10:50:39

2012-10-16 09:52:27

數據結構

2018-05-09 15:16:46

電競顯示器外觀

2010-04-14 09:32:40

Office 2010

2021-04-25 14:29:02

數據結構動態數組時間復雜度
點贊
收藏

51CTO技術棧公眾號

中国日本在线视频中文字幕| 波多野结衣家庭主妇| 91精品导航| 欧美日韩一区二区免费视频| 亚洲精品人成| www.亚洲欧美| 性色一区二区三区| 久久不射电影网| 9.1成人看片免费版| 日本黄色成人| 欧美日韩午夜激情| 中文字幕久久一区| 婷婷在线免费视频| 麻豆精品网站| 欧美激情一区二区久久久| 好吊视频在线观看| 国产成人一二片| 欧美日韩视频在线第一区| 日本福利视频一区| 欧美激情午夜| 国产亚洲短视频| 肥熟一91porny丨九色丨| 一级久久久久久| 亚洲国产专区校园欧美| 久久久av免费| 粉嫩精品久久99综合一区| 国内自拍欧美| 日韩欧美国产一区二区三区| 亚洲少妇久久久| 欧美私密网站| 亚洲va国产天堂va久久en| 日本黄色a视频| 国产精品99999| 99re这里只有精品视频首页| 97神马电影| 国产女人高潮时对白| 青青草国产精品97视觉盛宴| 日韩av电影中文字幕| 日本少妇做爰全过程毛片| 欧美精选一区| 色阁综合伊人av| 久久久久亚洲av无码a片| 成人福利一区| 日韩一级大片在线| 日本特黄在线观看| 日韩一级视频| 欧美日韩一区 二区 三区 久久精品| 2022亚洲天堂| 成人免费无遮挡| 欧美午夜影院在线视频| 日韩精品一区二区三区久久| 男人久久天堂| 欧美午夜精品久久久久久久| 成年人视频网站免费观看| 成人黄色动漫| 欧美午夜宅男影院在线观看| 日本三级免费观看| 玛雅亚洲电影| 欧美午夜宅男影院| 日本人视频jizz页码69| 欧美国产视频| 欧美一区二区久久| 美女露出粉嫩尿囗让男人桶| 国内毛片久久| 亚洲日本欧美中文幕| 国产伦精品一区二区三区视频女| 欧美少妇性xxxx| 色婷婷综合成人| 国产极品国产极品| 亚洲天堂偷拍| 热久久这里只有精品| 亚洲永久精品一区| 久久成人综合网| 99久久自偷自偷国产精品不卡| 亚洲精品中文字幕成人片 | www.成人黄色| 日韩精品成人| 日韩乱码在线视频| 午夜影院黄色片| 亚洲天堂免费| 欧美在线视频观看| a片在线免费观看| 国产一区在线观看视频| 精品国产一区二区三区麻豆免费观看完整版 | 亚洲最大成人在线视频| 国产精一品亚洲二区在线视频| 国产99在线免费| 国产高清自拍视频在线观看| 亚洲欧美日韩国产手机在线| 黄色一级视频在线播放| 欧美影视资讯| 日韩女优av电影| 新91视频在线观看| 欧美国产91| 欧美专区在线播放| 国产绿帽一区二区三区| 91蜜桃免费观看视频| 99精品视频网站| 日本午夜大片a在线观看| 欧美人妖巨大在线| xxxx黄色片| 这里只有精品在线| 国产精品成av人在线视午夜片| 成人1区2区3区| 亚洲国产精品99久久久久久久久| 免费cad大片在线观看| 日韩性xxx| 精品国产91乱码一区二区三区| 在线观看亚洲大片短视频| 欧美日韩一视频区二区| 国产国语刺激对白av不卡| 超碰在线观看av| |精品福利一区二区三区| 国产免费观看高清视频| 久久伊人久久| 最近更新的2019中文字幕| 日韩人妻无码一区二区三区99| 久88久久88久久久| 日韩电影大全在线观看| 国产h片在线观看| 日韩视频一区二区在线观看| 中文字幕91视频| 麻豆久久婷婷| 看高清中日韩色视频| 性欧美猛交videos| 欧美高清性hdvideosex| 亚洲精品一区二区三区影院忠贞| 亚洲精品黄色| 国产精品二区三区四区| 91国内在线| 337p亚洲精品色噜噜| 摸摸摸bbb毛毛毛片| 亚洲综合另类| 精品欧美一区二区三区久久久| 色女人在线视频| 欧美一三区三区四区免费在线看| 四虎国产成人精品免费一女五男| 丝袜脚交一区二区| 欧美日韩一区二区三区在线视频| 国产不卡人人| 亚洲激情自拍图| 国产成人精品亚洲男人的天堂| 国产不卡视频在线观看| 精品无码av无码免费专区| 日韩中文字幕视频网| 另类专区欧美制服同性| 99久久精品无免国产免费| 综合激情成人伊人| 两性午夜免费视频| 国产专区一区| 国产乱码精品一区二区三区日韩精品 | 国产高清不卡视频| 亚洲精品免费一二三区| 欧洲成人午夜精品无码区久久| 亚洲小说区图片区| 精品日本一区二区三区在线观看| 国产伦理精品| 精品亚洲一区二区三区四区五区| 免费的毛片视频| 亚洲国产成人私人影院tom| 91极品视频在线观看| 欧美mv日韩| 99精彩视频在线观看免费| 丁香花在线高清完整版视频| 日韩av网址在线观看| 日本中文字幕第一页| 欧美国产乱子伦| 日韩高清在线一区二区| 国产综合网站| 欧美国产一二三区| 欧美在线一级| 久久久久久这里只有精品| 日本天堂在线| 欧美剧在线免费观看网站| 九九九在线视频| 久久午夜免费电影| 日韩av一卡二卡三卡| 欧美色一级片| 欧洲久久久久久| 97精品资源在线观看| 羞羞色国产精品| 又爽又大又黄a级毛片在线视频| 欧美一区二区私人影院日本| 日本一级片免费看| 国产精品久久久久三级| 91超薄肉色丝袜交足高跟凉鞋| 麻豆精品网站| 国产人妻人伦精品| 精品视频免费在线观看| 91偷拍精品一区二区三区| 成人福利视频| 欧美国产一区二区三区| 秋霞av在线| 欧美一级日韩不卡播放免费| 久久99国产综合精品免费| 成人欧美一区二区三区1314| 亚洲蜜桃精久久久久久久久久久久| 蜜桃精品在线观看| 久久成人免费观看| 亚洲国产精品91| 视频一区亚洲| 无码少妇一区二区三区| 91中文字幕在线观看| 黑人精品一区| 久久久这里只有精品视频| 视频一区二区三区不卡| 日韩成人在线视频观看| av中文字幕免费在线观看| 91国模大尺度私拍在线视频| 日韩乱码人妻无码中文字幕| 亚洲少妇中出一区| 精品国产成人亚洲午夜福利| 国产成人av自拍| 天堂在线中文在线| 日日夜夜免费精品| 少妇无码av无码专区在线观看| 亚洲成人二区| 亚洲国产一区二区精品视频 | 自拍偷拍欧美亚洲| 亚洲精品亚洲人成人网| 国产传媒视频在线| 久久久精品中文字幕麻豆发布| 亚洲国产精品狼友在线观看| 国产真实乱偷精品视频免| 杨幂毛片午夜性生毛片| 先锋亚洲精品| 精品欧美一区免费观看α√| 精品成人一区| 东北少妇不带套对白| 国产精品sm| av久久久久久| 欧美一区在线看| 2021国产视频| 欧美伊人久久| 中文字幕日韩精品无码内射| 91精品秘密在线观看| 一区二区不卡在线| 日韩精品一区二区久久| 日韩hmxxxx| 日韩精品四区| 免费观看国产视频在线| 91精品国偷自产在线电影| 99精品一区二区三区的区别| 希岛爱理一区二区三区| 中文字幕日韩精品一区二区| 国产精品久久久久久影院8一贰佰| 亚洲精品一卡二卡三卡四卡| 成人激情视频| 亚洲午夜精品国产| 99re久久最新地址获取| 欧美日韩一级在线| 欧美在线91| 欧美在线一区视频| 性伦欧美刺激片在线观看| 久久久久人妻精品一区三寸| 久久婷婷av| 亚洲久久中文字幕| 国产乱人伦精品一区二区在线观看 | 日韩三级成人av网| 成人影院www在线观看| 欧美精品日韩三级| а_天堂中文在线| 57pao成人国产永久免费| 日本免费久久| 91精品国产综合久久男男 | 久久www免费人成看片高清| 五月婷婷之婷婷| 国产电影精品久久禁18| 久久福利小视频| 国产欧美一区视频| 精品人妻伦九区久久aaa片| 亚洲一区成人在线| 台湾佬中文在线| 欧美日韩一区二区三区四区五区| 99免费在线视频| 日韩电影在线观看中文字幕| 调教视频免费在线观看| 久久久久久综合网天天| 日韩福利一区| 99re国产在线播放| 免费久久精品| 男人的天堂视频在线| 亚洲专区欧美专区| 午夜视频在线观| 91免费在线视频观看| 小嫩苞一区二区三区| 亚洲成人福利片| 中文字幕精品在线观看| 欧美xxxx在线观看| 成人免费在线视频网| 美日韩精品视频免费看| 少妇一区视频| 粉嫩av一区二区三区免费观看| 精品成人影院| 福利视频一二区| 久久99九九99精品| 醉酒壮男gay强迫野外xx| 成人免费小视频| 日本中文字幕第一页| 欧美一区二区久久久| 国产一二三区在线视频| 欧美激情xxxx性bbbb| 2019年精品视频自拍| 国产欧美日本在线| 亚洲91久久| 婷婷丁香激情网| 99久久亚洲一区二区三区青草| 波多野结衣喷潮| 色婷婷久久久综合中文字幕| 日本免费一区视频| 另类图片亚洲另类| 成人国产精品| 免费观看成人高| 在线精品一区| 国产成人av片| 亚洲人成人一区二区在线观看| 91丨九色丨海角社区| 亚洲黄色在线看| 免费网站在线观看人| 91沈先生在线观看| 色综合天天综合网中文字幕| 国产天堂在线播放| 久久综合视频网| 日韩高清免费av| 亚洲精品一区二区精华| 四季久久免费一区二区三区四区| 成人免费午夜电影| 久久婷婷蜜乳一本欲蜜臀| 亚洲一二三区av| 国产性色一区二区| 人人爽人人爽人人片av| 亚洲欧美日韩国产精品| 成人欧美大片| 欧美日韩国产高清视频| 国产精品亚洲综合久久| 精品影片一区二区入口| 亚洲高清在线视频| 欧美 日韩 人妻 高清 中文| 欧美第一黄色网| 国内自拍欧美| 国产淫片免费看| 91性感美女视频| 久久亚洲精品国产| 日韩毛片在线看| 浪潮色综合久久天堂| 欧美精彩一区二区三区| 久久久久久久波多野高潮日日| 精品人妻一区二区三区香蕉| 黑人巨大精品欧美一区二区免费| 头脑特工队2在线播放| 2019国产精品自在线拍国产不卡| 首页亚洲中字| 天堂社区在线视频| 国产精品国产a| 国产av无码专区亚洲a∨毛片| 欧美噜噜久久久xxx| 2023国产精华国产精品| 97在线国产视频| 91色婷婷久久久久合中文| 在线精品免费视| 色999日韩欧美国产| 久久免费福利| 成人在线免费观看av| 国产欧美一区二区三区在线看蜜臀| 中文字幕在线看人| 色小说视频一区| 亚洲成人五区| 欧美成人一区二区在线观看| 国产欧美一区二区精品性| 国产乱淫av片免费| 久久久之久亚州精品露出| 美女福利一区| 亚洲最大综合网| 亚洲一区二区黄色| 国产毛片av在线| 亚洲综合色激情五月| 亚洲一区二区网站| 精品视频第一页| 精品av久久707| 福利一区和二区| 日韩国产一级片| 国产精品天美传媒| 蜜桃av中文字幕| 国产精品一区二区久久精品| 国内精品久久久久久久影视蜜臀| 亚洲黄色小说视频| 日韩欧美中文一区| 欧美一级大黄| 看一级黄色录像| 久久精品欧美日韩精品 | 亚洲丝袜一区在线| 日本在线视频一区二区三区| 97免费中文视频在线观看| 国产欧美日韩网站| 精彩视频一区二区| 日本三级午夜理伦三级三| 在线电影欧美日韩一区二区私密| 欧美视频三区| 欧美精品无码一区二区三区| 亚洲卡通欧美制服中文|