成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

訪問數組的任意位置元素的性能真的一樣?

系統
在我們的觀念當中,數組成員訪問的時間復雜度是O(1),每個成員都可以一次定位,因此訪問時間應該是一樣的。那如果我說,現在有一個一千萬元素的數組,那么訪問第一個元素與訪問最后一樣元素的時間是一樣的嗎?這個時候你會不會有所猶豫呢?

[[354803]]

 在我們的觀念當中,數組成員訪問的時間復雜度是O(1),每個成員都可以一次定位,因此訪問時間應該是一樣的。

那如果我說,現在有一個一千萬元素的數組,那么訪問第一個元素與訪問最后一樣元素的時間是一樣的嗎?這個時候你會不會有所猶豫呢?

實際動手驗證

實踐是檢驗真理的唯一手段。空想沒用,我們動手實際測試一下。我們實現如下所示的代碼,在該代碼中我們創建一個全局的數組,數組的大小是一千萬個元素。然后分別對第一個元素和最后一個元素賦值,并在賦值前后記錄時間。

  1. #define BUF_SIZE 10000000 //一千萬個元素 
  2.  
  3. int test_array[BUF_SIZE] = {}; 
  4.  
  5. int main( int argc, char* argv[] ) 
  6.  
  7.  
  8. long time1; 
  9.  
  10. long time2; 
  11.  
  12. time1 = get_time(); //獲取時間,單位是納秒 
  13.  
  14. test_array[0] = 1; //訪問第一個元素 
  15.  
  16. time2 = get_time(); 
  17.  
  18. printf("access first item time: %ld\n", time2-time1); 
  19.  
  20. time1 = get_time(); 
  21.  
  22. test_array[BUF_SIZE-1] = 1; //訪問最后一個元素 
  23.  
  24. time2 = get_time(); 
  25.  
  26. printf("access last item time: %ld\n", time2- time1); 
  27.  
  28. return(0); 
  29.  

 完成代碼后,我們編譯運行一下。為了得到穩定可靠的結果,我們多運行幾次。得到的結果如下所示。


從測試結果可以看出,訪問最后一個元素的性能明顯要比訪問第一個元素慢得多,有幾十倍的性能差異!

原因分析

要想搞清楚上述問題的原因,需要更加深入的理解計算機的原理,包括可執行程序的內存布局、操作系統進程的原理以及硬件層面的一些知識。接下來我們將逐步介紹相關內容,抽絲剝繭,搞清楚為什么有如此明顯的性能差異。

我們知道用戶態的程序都是運行在虛擬空間的,每個程序都有自己4GB的虛擬空間。這個虛擬空間又稱為虛擬內存。程序的虛擬內存并不是即刻分配的,而是按需分配。也就是說,只有在用戶訪問該部分內存的數據的時候,操作系統才會分配對應的物理內存,然后將數據加載到內存中。顯然,這種從硬盤再讀取數據的速度肯定要比直接訪問內存慢的多。

 

現代的CPU為了提高系統采用了多級緩存和流水線技術。CPU會根據程序的指令運行情況將部分數據或者指令預加載到緩存當中,這樣接下來就可以直接從從緩存讀取數據了。

 

根據存儲性能金字塔的數據,從緩存讀取數據的性能是從內存讀取性能的10倍以上。因此,如果代碼沒有規律,CPU無法預取數據和指令,那么程序的運行效率肯定會很低。

扯了這么遠,讓我們回到題目本身。由于這里數組比較大,因此當訪問第一個元素的時候,第一千萬個元素肯定是沒有被預讀的,之后訪問該數據大概率會發生缺頁中斷。所以,訪問第一個元素和最后一個元素在性能上是有差異的。

進一步的驗證

有了上面的分析,我們可以再做進一步的驗證。比如我們可以連續兩次訪問最后一個元素,看看兩者的區別。

  1. int main( int argc, char* argv[] ) 
  2.  
  3.  
  4. long time1; 
  5.  
  6. long time2; 
  7.  
  8. time1 = get_time(); 
  9.  
  10. test_array[0] = 1; 
  11.  
  12. time2 = get_time(); 
  13.  
  14. printf("access first item time: %ld\n", time2-time1); 
  15.  
  16. time1 = get_time(); 
  17.  
  18. test_array[BUF_SIZE-1] = 1; // 第一次訪問最后一個元素 
  19.  
  20. time2 = get_time(); 
  21.  
  22. printf("access last item time: %ld\n", time2- time1); 
  23.  
  24. time1 = get_time(); 
  25.  
  26. test_array[BUF_SIZE-1] = 1; // 第二次訪問最后一個元素 
  27.  
  28. time2 = get_time(); 
  29.  
  30. printf("access last item time: %ld\n", time2- time1); 
  31.  
  32. return(0); 
  33.  

 修改完代碼之后,執行該程序。同樣,我們多次執行該程序,確保結果穩定。通過下面執行結果可以看到,在第二次執行是其時間與訪問第一個元素相當,已經沒有那么明顯的差異了。


通過上面的學習,大家是不是覺得深入學習計算機原理層面的重要性了。關于更多計算機深層次的內容,我們后面會繼續分享給大家。

 

責任編輯:姜華 來源: 今日頭條
相關推薦

2020-03-02 10:56:41

辦公電腦疫情

2011-02-28 10:38:13

Windows 8

2012-03-07 17:24:10

戴爾咨詢

2012-12-20 10:17:32

IT運維

2009-06-12 15:26:02

2015-08-25 09:52:36

云計算云計算產業云計算政策

2013-01-11 18:10:56

軟件

2015-10-19 12:33:01

華三/新IT

2017-05-25 15:02:46

聯宇益通SD-WAN

2016-05-09 18:40:26

VIP客戶緝拿

2009-02-04 15:43:45

敏捷開發PHPFleaPHP

2009-12-01 16:42:27

Gentoo Linu

2021-12-22 07:31:18

RedisNoSQL數據庫

2018-05-09 15:42:24

新零售

2020-02-28 15:49:26

2021-04-22 22:29:40

Python開發算法

2016-03-24 18:51:40

2009-11-26 13:16:25

Open Suse

2020-05-19 10:02:58

CIOIPD集成產品開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产精品久久一区 | 91精品国产91久久久久久最新 | 北条麻妃一区二区三区在线视频 | aaa级片 | 成人精品一区二区三区中文字幕 | 亚洲成人一区 | 欧美成人a| 在线观看国产www | 黄色一级大片在线免费看产 | 亚洲欧美激情网 | 亚洲精品在线看 | 精品国产乱码久久久久久88av | 亚洲视频中文字幕 | 欧美一级在线 | 不卡一区| 欧美一区二区二区 | 欧美一区视频 | 91极品尤物在线播放国产 | 97国产成人 | 欧美在线观看一区 | 中文字幕在线一区 | av一区二区三区在线观看 | 99免费视频 | 精品国产一区二区三区四区在线 | 欧美天堂| 亚洲精品日韩精品 | 久久精品16 | 亚洲三级视频 | 伊人久麻豆社区 | 国产精品特级毛片一区二区三区 | 免费精品视频 | 久久久久久精 | 久久国产精品99久久久久久丝袜 | 日韩欧美在 | 精品福利视频一区二区三区 | 91精品国产91久久久久游泳池 | 欧美精品区 | 日本免费在线 | 成人免费一区二区三区视频网站 | 亚洲精品在线免费播放 | 国产农村妇女精品一二区 |