Cpu快取命中與未命中區別java演示

2021-08-25 14:13:11 字數 1795 閱讀 5637

在現代計算機當中,cpu是大腦,最終都是由它來執行所有的運算。而記憶體(ram)則是血液,存放著執行的資料;但是,由於cpu和記憶體之間的工作頻率不同,cpu如果直接去訪問記憶體的話,系統效能將會受到很大的影響,所以在cpu和記憶體之間加入了**快取,分別是l1、l2、l3。

當cpu執行運算時,它首先會去l1快取中查詢資料,找到則返回;如果l1中不存在,則去l2中查詢,找到即返回;如果l2中不存在,則去l3中查詢,查到即返回。如果**快取中都不存在,最終會去記憶體中查詢。對於cpu來說,走得越遠,就越消耗時間,拖累效能。

在**快取中,越靠近cpu的快取,速度越快,容量也越小,所以l1快取是最快的,當然製作的成本也是最高的,其次是l2、l3。

cpu頻率,就是cpu運算時的工作的頻率(1秒內發生的同步脈衝數)的簡稱,單位是hz。主頻由過去mhz發展到了當前的ghz(1ghz=103mhz=106khz= 10^9hz)。

記憶體頻率和cpu頻率一樣,習慣上被用來表示記憶體的速度,記憶體頻率是以mhz(兆赫)為單位來計量的。目前較為主流的記憶體頻率1066mhz、1333mhz、1600mhz的ddr3記憶體,2133mhz、2400mhz、2666mhz、2800mhz、3000mhz、3200mhz的ddr4記憶體。

可以看得出,如果cpu直接訪問記憶體,是一件相當耗時的操作。

當資料被載入到**快取中,它是以快取行的形式存在的,不是乙個單獨的項,也不是單獨的指標。

在cpu快取中,資料是以快取行(cache line)為單位進行儲存的,每個快取行的大小一般為32--256個位元組,常用cpu中快取行的大小是64位元組;cpu每次從記憶體中讀取資料的時候,會將相鄰的資料也一併讀取到快取中,填充整個快取行;

可想而知,當我們遍歷陣列的時候,cpu遍歷第乙個元素時,與之相鄰的元素也會被載入到了快取中,對於後續的遍歷來說,cpu在快取中找到了對應的資料,不需要再去記憶體中查詢,效率得到了巨大的提公升;

但是,在多執行緒環境中,也會出現偽共享的情況,造成程式效能的降低,堪稱無形的效能殺手;

/**

* @描述 64位機,乙個物件大頭16 個位元組,乙個 long 型別 8個位元組 6*8 +16 = 64個位元組 佔滿乙個快取

* @引數 $ cpu快取中,資料是以快取行(cache line)為單位進行儲存

* @返回值 $

* @建立人

* @建立時間 $

* @修改人和其它資訊

*/public class cachetest

}hitcache();

catchmiss();

}/**

* 演示快取命中

*/public static void hitcache()

}system.out.print("hitcache: ");

system.out.println(system.nanotime() - start);

}/**

* 快取位未命中

*/public static void catchmiss()

}system.out.print("catchmiss: ");

system.out.println(system.nanotime() - start);}}

css命中與jquery命中

nth of type 選擇器是jquery 1.9新增的選擇器,它是遵循css 3中結構性偽類選擇符 e nth of type n 實現的。和css 3中結構性偽類選擇符 e nth of type n 一樣,它選擇的是匹配所有父元素下同型別中的第n個同級兄弟元素e。nth of type 選擇...

快取命中率

安裝 docker redis 查詢乙個不存在的key 127.0.0.1 6379 get test nil 在看命中率 新插入乙個值 name 127.0.0.1 6379 set name jackma ok查詢name 127.0.0.1 6379 get name jackma 再看命中率...

快取命中率

避免命中 函式計算 無服務架構 tmp 初始化清空 tmp空間限制,新檔案生成 利用命中 快取命中率 終端使用者訪問加速節點時,如果該節點有快取住了要被訪問的資料時就叫做命中,如果沒有的話需要回原伺服器取,就是沒有命中。取資料的過程與使用者訪問是同步進行的,所以即使是重新取的新資料,使用者也不會感覺...