亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

通過Java視角簡單談?wù)劸植啃栽?/h1>
瀏覽:81日期:2022-08-09 09:14:20
局部性原理

程序在訪問數(shù)據(jù)時,都趨于聚集在一片連續(xù)的區(qū)域中,這被稱為局部性原理。

按時間和空間劃分為兩類:

時間局部性:如果一個數(shù)據(jù)正在被訪問,那么近期它很可能再次被訪問。 空間局部性:如果某一個位置的數(shù)據(jù)被訪問,那么這個問題附近的數(shù)據(jù)很可能被訪問。

針對局部性原理,CPU和操作系統(tǒng)都有具體的實(shí)現(xiàn)。

本文主要總結(jié)梳理CPU和操作系統(tǒng)的局部性原理在Java后端中的影響與意義。

CPU空間局部性

如下圖是Java的內(nèi)存模型

通過Java視角簡單談?wù)劸植啃栽? src=

我們知道CPU為提高從內(nèi)存中讀數(shù)據(jù)的性能,有L1、L2、L3三個級別的高速緩存。

CPU利用局部性原理,在從內(nèi)存讀取數(shù)據(jù)項(xiàng)到緩存時,將該內(nèi)存附近的數(shù)據(jù)塊也一并讀取到緩存中,這一過程稱為預(yù)讀。

即讀取連續(xù)空間的內(nèi)存要比內(nèi)存隨機(jī)訪問的性能要高,這一點(diǎn)用Java程序可以證明。

public static void main(String[] args) {int[][] arr = new int[10000][10000];int sum = 0;long startTime = System.currentTimeMillis();for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[0].length; j++) {sum += arr[i][j]; }}System.out.println('數(shù)組順序訪問耗時:' + (System.currentTimeMillis() - startTime) + 'ms');sum = 0;startTime = System.currentTimeMillis();for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr[0].length; j++) {sum += arr[j][i]; }}System.out.println('數(shù)組非順序訪問耗時:' + (System.currentTimeMillis() - startTime) + 'ms'); }

這是一段對二維數(shù)組循環(huán)讀取的代碼。

程序的上半部分是按數(shù)組的第二維開始順序讀取,即二維數(shù)組逐行按內(nèi)存連續(xù)空間順序訪問。

下半部分則是按數(shù)組的第一維按列讀取,不是順序訪問。

分別經(jīng)過10000*10000次的數(shù)組訪問后,其運(yùn)行結(jié)果如下:

通過Java視角簡單談?wù)劸植啃栽? src=

由此可見,對內(nèi)存的順序訪問性能優(yōu)于隨機(jī)訪問。

磁盤空間局部性

在Java日常開發(fā)中,很多的中間件都需要跟磁盤文件打交道,這些磁盤數(shù)據(jù)的高性能訪問也都依托于局部性原理,比如:

MySql的日志文件 MQ消息數(shù)據(jù)

我們知道MySql的數(shù)據(jù)最終都保存在磁盤中,為減少磁盤IO提高性能,InnoDB引擎底層依托BufferPoll+redo log機(jī)制來提高mySql讀寫性能(具體可參考MySql原理總結(jié))。而針對redo log、undo log、binlog的讀寫避免不了磁盤IO,那么這里就利用操作系統(tǒng)的PageCache機(jī)制,對磁盤數(shù)據(jù)順序讀寫,使得磁盤IO的性能近乎于內(nèi)存性能。

我們常說kafka和rocketMQ是高性能的消息中間件,其中一部分高性能就依托于對磁盤文件的順序讀寫。比如commit log的順序?qū)懭耄琸afka中partition、rockerMQ中consumerQueue中消息的順序讀寫。同樣的也是利用操作系統(tǒng)的PageCache機(jī)制。

PageCache

頁緩存(PageCache)是OS對文件的緩存,用于加速對文件的讀寫。一般來說,程序?qū)ξ募M(jìn)行順序讀寫的速度幾乎接近于內(nèi)存的讀寫速度,主要原因就是由于OS使用PageCache機(jī)制對讀寫訪問操作進(jìn)行了性能優(yōu)化,將一部分的內(nèi)存用作PageCache。

對于數(shù)據(jù)的寫入,OS會先寫入至Cache內(nèi),隨后通過異步的方式由pdflush內(nèi)核線程將Cache內(nèi)的數(shù)據(jù)刷盤至物理磁盤上。

對于數(shù)據(jù)的讀取,如果一次讀取文件時出現(xiàn)未命中PageCache的情況,OS從物理磁盤上訪問讀取文件的同時,會順序?qū)ζ渌噜弶K的數(shù)據(jù)文件進(jìn)行預(yù)讀取。

而PageCache就是局部性原理的實(shí)現(xiàn)。

時間局部性

時間局部性可能在我們?nèi)粘I(yè)務(wù)開發(fā)中體現(xiàn)得更明顯。

類似LRU緩存都是其具體實(shí)現(xiàn)。

另外CPU的指令重排序也貼點(diǎn)邊,比如對一個數(shù)據(jù)的訪問計(jì)算,優(yōu)先將于這數(shù)據(jù)有關(guān)的指令排在一起處理。

參考

知乎:如何理解操作系統(tǒng)中的局部性原理 gitHub:RocketMQ設(shè)計(jì)文檔總結(jié)

到此這篇通過Java視角簡單談?wù)劸植啃栽淼奈恼戮徒榻B到這了,更多相關(guān)Java局部性原理內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:

主站蜘蛛池模板: 日韩中文字幕不卡 | 黄色片在线观看网址 | 国产精品亚洲精品影院 | 草草免费视频 | 亚洲欧美片 | 韩日欧美 | 伊人久久综合影院 | 国产精品一级视频 | 7m凹凸国产刺激在线视频 | 国产视频在线观看免费 | 成人卡通精品卡通动漫第一页 | 亚洲精品一区二区三区第四页 | 一级黄色激情片 | 精品在线观看免费 | 成人久久免费视频 | 丁香婷婷网 | 亚洲一区二区三区高清 不卡 | 日本理论片中文在线观看2828 | 久草视频新 | 久久伊人热老鸭窝 | 一级片在线免费播放 | 99re5久久在热线播放 | 久久5 | 亚洲国产日产韩国欧美综合 | 国产亚洲欧美日韩在线观看一区二区 | 影音先锋ady69色资源网站 | 成人久久18免费软件 | 综合色综合 | 高清视频黄色录像免费 | 91福利视频免费 | 最新香蕉97超级碰碰碰碰碰久 | 国产精品第1页在线观看 | 亚洲欧洲国产日产 | c看欧美激情毛片 | 国产精品久久久久9999赢消 | 免费观看欧美性一级 | 真正国产乱子伦高清对白 | 一级黄色片在线看 | 精品国产免费久久久久久婷婷 | 色很久| 免费国产成人手机在线观看 |