缓存行

都是遍历为什么差距就这么大呢?
差距就在缓存上
CPU的缓存是以行为单位的,一次读就读连续的一整行(64字节),失效也是一起失效.
而上面的这种二维数组在内存中的存储时连续的

在加载缓存的时候会把附件的元素也一起读入(因为时连续的)
按行遍历是依照内存的存储顺序依次遍历,缓存的利用率高所以快
而按列遍历时跳跃式的遍历,他不是连续的.这时候缓存的利用率就极低(数组越大越明显),CPU要频繁的去主存中取数据,效率可想而知.
伪共享
相互独立的变量,在同一个缓存行上,这些变量都分别被多个CPU频繁修改,导致整个缓存行经常失效.一个变量改了其他的变量也失效了…
这就非常尬尴了.
缓存行对齐
为了解决上面的尬尴,我们可以手动将一个对象对齐一行.
但是这样有很大的问题,因为不同平台的缓存行,对象大小并不一定时一样的.
这违背了java的核心思想 跨平台
好在jdk1.8以后提供@sun.misc.Contended这个注解可以由jvm帮忙我们实现对齐
博客探讨了CPU缓存的工作原理,强调了按行遍历二维数组相较于按列遍历的效率优势,因后者可能导致缓存利用率低下。同时,介绍了伪共享问题,即独立变量位于同一缓存行可能导致频繁失效。解决方案包括缓存行对齐,但这也带来了跨平台问题。JDK1.8后的@sun.misc.Contended注解可以帮助解决对齐问题。
573

被折叠的 条评论
为什么被折叠?



