最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++?CPU的局部性原理兩種類型解析

 更新時(shí)間:2026年02月03日 10:53:38   作者:Q雨巷  
這篇文章給大家介紹了CPU的局部性原理,包括時(shí)間局部性、空間局部性以及如何通過緩存利用這些局部性來提高程序性能,局部性原理是現(xiàn)代計(jì)算機(jī)體系結(jié)構(gòu)和高性能編程的核心思想,感興趣的朋友跟隨小編一起看看吧

CPU的局部性原理

github地址

有夢想的電信狗

前言

在實(shí)際編程中,我們常會發(fā)現(xiàn):
邏輯相同的代碼,僅僅改變數(shù)據(jù)訪問順序,性能卻可能相差數(shù)倍。

造成這種差異的根本原因,正是現(xiàn)代 CPU 的核心設(shè)計(jì)思想之一——局部性原理(Locality Principle)。

隨著學(xué)習(xí)從“會寫代碼”走向“寫出高性能代碼”,我們會發(fā)現(xiàn):
真正影響程序速度的,往往不是算法本身,而是內(nèi)存訪問模式與緩存命中率

本文將圍繞局部性原理展開,系統(tǒng)講解:

  • 什么是局部性原理
  • 時(shí)間局部性與空間局部性的區(qū)別
  • CPU 緩存如何利用局部性
  • 代碼訪問方式為何會顯著影響性能

幫助你理解程序性能與底層硬件之間的真實(shí)聯(lián)系

一、什么是局部性原理?

局部性原理(Locality Principle) 是指在程序運(yùn)行過程中,所訪問的指令和數(shù)據(jù)往往集中在較小的區(qū)域內(nèi),而不會隨機(jī)分布在整個內(nèi)存空間中。

換句話說:

程序的訪問行為有“偏好”,更傾向于訪問“剛剛訪問過”或“靠近剛剛訪問過”的內(nèi)存區(qū)域。

這種規(guī)律來源于:

  • 程序的控制結(jié)構(gòu)(循環(huán)、函數(shù)調(diào)用)
  • 數(shù)據(jù)結(jié)構(gòu)的訪問方式(數(shù)組、指針、鏈表等)
  • 編譯器生成代碼的局部性優(yōu)化

因此,CPU 可以利用這一規(guī)律,通過在緩存中保存近期訪問的數(shù)據(jù)或指令,極大提高訪問速度。

二、局部性原理的兩種類型

1. 時(shí)間局部性(Temporal Locality)

如果一個數(shù)據(jù)項(xiàng)被訪問過,那么它很可能在不久的將來再次被訪問。

典型場景:

int sum = 0;
for (int i = 0; i < 1000; ++i)
    sum += a[i];
  • 變量 sum 每次循環(huán)都會被訪問(修改一次、讀取一次)。
  • 數(shù)組 a[i] 的每個元素雖然只訪問一次,但循環(huán)體代碼在短時(shí)間內(nèi)不斷執(zhí)行。

因此:

  • sum 展現(xiàn)了強(qiáng)時(shí)間局部性。
  • 循環(huán)體指令也有時(shí)間局部性,因?yàn)?CPU 在短時(shí)間內(nèi)反復(fù)執(zhí)行同一段指令。

2. 空間局部性(Spatial Locality)

如果程序訪問了某個地址的數(shù)據(jù),那么它很可能在不久之后訪問與該地址相鄰的數(shù)據(jù)。

典型場景:

for (int i = 0; i < 1000; ++i)
    sum += a[i];
  • 當(dāng) CPU 訪問 a[0] 時(shí),極有可能緊接著訪問 a[1]、a[2]……
  • 因此 CPU 在加載內(nèi)存塊時(shí),會預(yù)?。≒refetch)一整塊連續(xù)內(nèi)存到緩存中(例如 64B 一行的 cache line)。

→ 這就是 空間局部性

三、為什么需要局部性原理?

內(nèi)存層次結(jié)構(gòu)如下:

層級存儲類型訪問延遲容量特征
寄存器Register~1ns極小位于 CPU 內(nèi)部
一級緩存L1 Cache~2-4nsKB 級每個核心獨(dú)享
二級緩存L2 Cache~10nsMB 級每核心或共享
三級緩存L3 Cache~30-40ns數(shù)十MB多核共享
主內(nèi)存DRAM~100nsGB 級訪問慢
硬盤/SSDStorage>10?nsTB 級極慢

如果 CPU 每次都直接訪問主內(nèi)存(DRAM),效率會極低。
但由于局部性原理,CPU 可以:

  • 把最近或附近的數(shù)據(jù)緩存到 L1/L2/L3 Cache;
  • 當(dāng)再次訪問時(shí),直接命中緩存,訪問速度提升數(shù)十倍到上百倍。

四、緩存設(shè)計(jì)如何利用局部性?

緩存機(jī)制利用的局部性示例
Cache line(緩存行)空間局部性一次加載連續(xù)64字節(jié)數(shù)據(jù)
Cache 替換策略(LRU)時(shí)間局部性最近使用的優(yōu)先保留
Prefetch(預(yù)取機(jī)制)空間局部性預(yù)測程序下一個訪問位置
分支預(yù)測(Branch Prediction)時(shí)間局部性預(yù)測指令執(zhí)行路徑

五、代碼層面如何體現(xiàn)局部性?

? 好的例子:行優(yōu)先遍歷(空間局部性強(qiáng))

const int N = 1024;
int a[N][N];
int sum = 0;
for (int i = 0; i < N; ++i)
    for (int j = 0; j < N; ++j)
        sum += a[i][j];
  • 數(shù)組 a 在內(nèi)存中按行存儲(C/C++ 默認(rèn)行主序)。
  • 連續(xù)訪問 a[i][j]a[i][j+1],命中率高。

? 壞的例子:列優(yōu)先遍歷(空間局部性差)

for (int j = 0; j < N; ++j)
    for (int i = 0; i < N; ++i)
        sum += a[i][j];
  • 訪問 a[i][j]a[i+1][j] 在內(nèi)存中距離較遠(yuǎn),緩存命中率低,性能顯著下降。

六、局部性與性能優(yōu)化的關(guān)系

優(yōu)化目標(biāo)對應(yīng)局部性示例策略
提高 Cache 命中率時(shí)間 + 空間減少隨機(jī)訪問,復(fù)用數(shù)據(jù)
編譯器優(yōu)化時(shí)間循環(huán)展開、函數(shù)內(nèi)聯(lián)
內(nèi)存對齊空間避免跨 Cache line 訪問
數(shù)據(jù)結(jié)構(gòu)優(yōu)化空間結(jié)構(gòu)體緊湊排列、SoA 替代 AoS
多線程編程時(shí)間 + 空間減少偽共享(false sharing)

七、直觀示意圖(邏輯圖)

         ┌──────────────┐
         │   CPU Core   │
         └──────┬───────┘
                │ 訪問頻繁數(shù)據(jù)
                ▼
         ┌──────────────┐
         │   L1 Cache   │ ← 時(shí)間局部性:重復(fù)訪問同一數(shù)據(jù)
         └──────┬───────┘
                │ 訪問鄰近數(shù)據(jù)
                ▼
         ┌──────────────┐
         │   L2 Cache   │ ← 空間局部性:加載相鄰數(shù)據(jù)塊
         └──────┬───────┘
                │
                ▼
         ┌──────────────┐
         │    DRAM      │
         └──────────────┘

八、小結(jié)

項(xiàng)目時(shí)間局部性空間局部性
定義近期訪問的數(shù)據(jù)可能再次被訪問訪問某地址的數(shù)據(jù)后,可能訪問鄰近地址
典型表現(xiàn)循環(huán)變量、計(jì)數(shù)器、函數(shù)調(diào)用數(shù)組遍歷、順序讀取文件
緩存利用Cache 替換策略Cache line 預(yù)取
程序優(yōu)化減少重復(fù)計(jì)算、循環(huán)優(yōu)化順序訪問、內(nèi)存對齊

九、延伸:局部性與現(xiàn)代 CPU 特性

CPU 特性依賴局部性說明
分支預(yù)測(Branch Predictor)時(shí)間局部性程序的分支往往重復(fù)同樣的路徑
指令預(yù)?。↖nstruction Prefetch)空間局部性指令存儲在連續(xù)地址中
超標(biāo)量流水線(Superscalar Pipeline)時(shí)間局部性指令流局部集中,可亂序執(zhí)行
Cache 多級設(shè)計(jì)時(shí)間 + 空間快速響應(yīng)最近/鄰近訪問請求

??總結(jié)一句話

CPU 的局部性原理 是計(jì)算機(jī)性能優(yōu)化的核心思想之一:
程序訪問有規(guī)律,緩存利用這規(guī)律。

“剛訪問的內(nèi)容未來還會用到(時(shí)間局部性),
附近的內(nèi)容也值得提前準(zhǔn)備(空間局部性)。”

結(jié)語

局部性原理看似簡單,卻貫穿了整個現(xiàn)代計(jì)算機(jī)體系結(jié)構(gòu)。

無論是多級緩存、預(yù)取機(jī)制、分支預(yù)測,還是我們在代碼中進(jìn)行的循環(huán)優(yōu)化、數(shù)據(jù)布局調(diào)整,本質(zhì)上都是在減少內(nèi)存訪問帶來的等待時(shí)間

當(dāng)你理解了局部性原理,就能看清許多“性能差異”的本質(zhì):
順序訪問為什么更快?
結(jié)構(gòu)體布局為何會影響效率?

答案,都藏在“局部性”之中。

希望本文能成為你理解計(jì)算機(jī)性能本質(zhì)的一塊基石,
在你深入操作系統(tǒng)、體系結(jié)構(gòu)與高性能編程時(shí),持續(xù)發(fā)揮作用。

到此這篇關(guān)于C++ CPU的局部性原理的兩種類型解析的文章就介紹到這了,更多相關(guān)C++ CPU局部性原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Qt網(wǎng)絡(luò)編程實(shí)現(xiàn)TCP通信

    Qt網(wǎng)絡(luò)編程實(shí)現(xiàn)TCP通信

    這篇文章主要為大家詳細(xì)介紹了Qt網(wǎng)絡(luò)編程實(shí)現(xiàn)TCP通信,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C語言排序算法之冒泡排序?qū)崿F(xiàn)方法【改進(jìn)版】

    C語言排序算法之冒泡排序?qū)崿F(xiàn)方法【改進(jìn)版】

    這篇文章主要介紹了C語言排序算法之冒泡排序?qū)崿F(xiàn)方法,結(jié)合具體實(shí)例形式分析了C語言實(shí)現(xiàn)的基本冒泡排序?qū)崿F(xiàn)方法及增設(shè)flag標(biāo)志位的改進(jìn)型算法,需要的朋友可以參考下
    2017-09-09
  • C語言詳細(xì)實(shí)現(xiàn)猜拳游戲流程

    C語言詳細(xì)實(shí)現(xiàn)猜拳游戲流程

    在學(xué)習(xí)了循環(huán)、分支、和函數(shù)之后,可以寫一些簡單的小游戲來給自己的編程之路增添一份樂趣。不僅提升了編碼能力,還可以邊學(xué)邊玩,簡直妙哉妙哉
    2022-05-05
  • C語言基于EasyX繪制時(shí)鐘

    C語言基于EasyX繪制時(shí)鐘

    這篇文章主要為大家詳細(xì)介紹了C語言基于EasyX繪制時(shí)鐘,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++11?lambda(匿名函數(shù))表達(dá)式詳細(xì)介紹

    C++11?lambda(匿名函數(shù))表達(dá)式詳細(xì)介紹

    lambda 表達(dá)式(lambda expression)是一個匿名函數(shù),C++11中的lambda表達(dá)式用于定義并創(chuàng)建匿名的函數(shù)對象,以簡化編程工作,下面這篇文章主要給大家介紹了關(guān)于C++11?lambda(匿名函數(shù))表達(dá)式的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • C語言多線程服務(wù)器的實(shí)現(xiàn)實(shí)例

    C語言多線程服務(wù)器的實(shí)現(xiàn)實(shí)例

    這篇文章主要介紹了C語言多線程服務(wù)器的實(shí)現(xiàn)實(shí)例,文章用實(shí)例講解的很清楚,有對這方面不太懂的同學(xué)可以參考下
    2021-02-02
  • DEV?C++源碼編譯后控制臺輸出中文亂碼問題解決

    DEV?C++源碼編譯后控制臺輸出中文亂碼問題解決

    本文主要介紹了DEV?C++源碼編譯后控制臺輸出中文亂碼問題解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • C++使用Mutex實(shí)現(xiàn)讀寫鎖思路

    C++使用Mutex實(shí)現(xiàn)讀寫鎖思路

    這篇文章主要介紹了C++使用Mutex實(shí)現(xiàn)讀寫鎖思路,詳細(xì)介紹了讀寫鎖需要具有的特征,通過實(shí)例代碼給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2025-05-05
  • C++實(shí)現(xiàn)圖書信息管理系統(tǒng)

    C++實(shí)現(xiàn)圖書信息管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)圖書信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • VisualStudio Community2019在安裝的過程中無法進(jìn)入安裝界面的解決方法

    VisualStudio Community2019在安裝的過程中無法進(jìn)入安裝界面的解決方法

    這篇文章主要介紹了VisualStudio Community2019在安裝的過程中無法進(jìn)入安裝界面的解決方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03

最新評論

隆尧县| 武陟县| 弥勒县| 绥宁县| 太湖县| 泸溪县| 册亨县| 大关县| 许昌县| 盖州市| 崇文区| 芦山县| 衡阳市| 台南市| 嘉义县| 拉孜县| 灵武市| 台山市| 泰宁县| 隆安县| 佛冈县| 牙克石市| 远安县| 察雅县| 永丰县| 伊金霍洛旗| 仁化县| 天门市| 曲阳县| 永登县| 黄大仙区| 时尚| 全椒县| 桐城市| 竹溪县| 博湖县| 山西省| 图木舒克市| 洞口县| 额尔古纳市| 柳河县|