欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過Java視角簡單談談局部性原理

 更新時間:2021年07月13日 14:29:47   作者:幻_  
程序的局部性原理是指程序在執(zhí)行時呈現(xiàn)出局部性規(guī)律,即在一段時間內,整個程序的執(zhí)行僅限于程序中的某一部分,這篇文章主要給大家介紹了關于通過Java視角簡單談談局部性原理的相關資料,需要的朋友可以參考下

局部性原理

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

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

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

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

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

CPU空間局部性

如下圖是Java的內存模型

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

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

即讀取連續(xù)空間的內存要比內存隨機訪問的性能要高,這一點用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ù)組逐行按內存連續(xù)空間順序訪問。

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

分別經過10000*10000次的數(shù)組訪問后,其運行結果如下:

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

磁盤空間局部性

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

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

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

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

PageCache

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

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

對于數(shù)據的讀取,如果一次讀取文件時出現(xiàn)未命中PageCache的情況,OS從物理磁盤上訪問讀取文件的同時,會順序對其他相鄰塊的數(shù)據文件進行預讀取。

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

時間局部性

時間局部性可能在我們日常業(yè)務開發(fā)中體現(xiàn)得更明顯。

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

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

參考

總結

到此這篇通過Java視角簡單談談局部性原理的文章就介紹到這了,更多相關Java局部性原理內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 記一次Maven項目改造成SpringBoot項目的過程實踐

    記一次Maven項目改造成SpringBoot項目的過程實踐

    本文主要介紹了Maven項目改造成SpringBoot項目的過程實踐,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Spring @Order注解使用詳解

    Spring @Order注解使用詳解

    注解@Order或者接口Ordered的作用是定義Spring IOC容器中Bean的執(zhí)行順序的優(yōu)先級,而不是定義Bean的加載順序,Bean的加載順序不受@Order或Ordered接口的影響
    2022-08-08
  • Java整合Redis實現(xiàn)坐標附近查詢功能

    Java整合Redis實現(xiàn)坐標附近查詢功能

    這篇文章主要介紹了Java整合Redis實現(xiàn)坐標附近查詢,我們可以在redis服務器使用命令 help xxx 查看指令的具體用法,本文給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2023-11-11
  • Java實現(xiàn)快速生成詞云圖的示例代碼

    Java實現(xiàn)快速生成詞云圖的示例代碼

    詞云(Word?Cloud),又稱文字云、標簽云(Tag?Cloud)、關鍵詞云(Keyword?Cloud),是對文本信息中一定數(shù)量的關鍵詞出現(xiàn)的頻率高低情況的一種可視化展現(xiàn)方式。本文將用Java代碼實現(xiàn)快速生成詞云圖,需要的可以參考一下
    2023-02-02
  • Java中的弗洛伊德(Floyd)算法

    Java中的弗洛伊德(Floyd)算法

    這篇文章主要介紹了Java中的弗洛伊德(Floyd)算法,Floyd算法又稱為插點法,是一種利用動態(tài)規(guī)劃的思想尋找給定的加權圖中多源點之間最短路徑的算法,與Dijkstra算法類似,需要的朋友可以參考下
    2024-01-01
  • Java中管理資源的引用隊列相關原理解析

    Java中管理資源的引用隊列相關原理解析

    這篇文章主要介紹了Java中管理資源的引用隊列相關原理解析,涉及到Java的垃圾回收機制方面的知識,需要的朋友可以參考下
    2015-12-12
  • springmvc的validator數(shù)據校驗的實現(xiàn)示例代碼

    springmvc的validator數(shù)據校驗的實現(xiàn)示例代碼

    這篇文章主要介紹了springmvc的數(shù)據校驗的實現(xiàn)示例代碼, 具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • Spring?Boot整合ELK實現(xiàn)日志采集與監(jiān)控

    Spring?Boot整合ELK實現(xiàn)日志采集與監(jiān)控

    這篇文章主要介紹了Spring?Boot整合ELK實現(xiàn)日志采集與監(jiān)控,需要的朋友可以參考下
    2022-06-06
  • Java定義泛型方法實例分析

    Java定義泛型方法實例分析

    這篇文章主要介紹了Java定義泛型方法,結合實例形式分析了java定義泛型的相關操作技巧與注意事項,需要的朋友可以參考下
    2019-07-07
  • Java中的流式編程問題

    Java中的流式編程問題

    這篇文章主要介紹了Java中的流式編程問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評論