为了获得现代计算机相对于缓存未命中的实际性能(如何'传播'是内存中的数据),我进行了一个简单的测试,我分配500 MB的RAM,然后执行恒定数量的读取,以及我通过增加字节偏移来执行该测试.最后,当我到达它时,我将1000 MB缓冲区的末尾包裹起来.
我对结果感到非常惊讶.看起来有大约32字节的成本障碍,另一个大约32 KB.我想这与L1/L2/L3缓存加载或虚拟内存页面大小有关?令我震惊的是,似乎只有大约16个完全不同的内存位置被缓存.那非常低!任何解释(操作系统,硬件)?
以下是3台不同计算机上的结果,从最快的一台到最便宜的一台,其次是我的简单测试代码(仅使用标准库).
16 GB RAM快速HP工作站(32位Windows测试):
time=0.364000 byteIncrement=4 numReadLocations=262144000 numReads=262144000
time=0.231000 byteIncrement=8 numReadLocations=131072000 numReads=262144000
time=0.339000 byteIncrement=16 numReadLocations=65536000 numReads=262144000
time=0.567000 byteIncrement=32 numReadLocations=32768000 numReads=262144000
time=1.177000 byteIncrement=64 numReadLocations=16384000 numReads=262144000
time=1.806000 byteIncrement=128 numReadLocations=8192000 numReads=262144000
time=2.293000 byteIncrement=256 numReadLocations=4096000 numReads=262144000
time=2.464000 byteIncrement=512 numReadLocations=2048000 numReads=262144000
time=2.621000 byteIncrement=1024 numReadLocations=1024000 numReads=262144000
time=2.775000 byteIncrement=2048 numReadLocations=512000 numReads=262144000
time=2.908000 byteIncrement=4096 numReadLocations=256000 numReads=262144000
time=3.007000 byteIncrement=8192 numReadLocations=128000 numReads=262144000
time=3.183000 byteIncrement=16384 numReadLocations=64000 numReads=262144000
time=3.758000 byteIncrement=32768 numReadLocations=32000 numReads=262144000
time=4.287000 byteIncrement=65536 numReadLocations=16000 numReads=262144000
time=6.366000 byteIncrement=131072 numReadLocations=8000 numReads=262144000
time=6.124000 byteIncrement=262144 numReadLocations=4000 numReads=262144000
time=5.295000 byteIncrement=524288 numReadLocations=2000 …Run Code Online (Sandbox Code Playgroud)