码迷,mamicode.com
首页 > 系统相关 > 详细

cache缓存与伪共享

时间:2020-01-06 09:41:35      阅读:102      评论:0      收藏:0      [点我收藏+]

标签:out   程序   rgs   vol   color   元素   misc   修改   命中   

一、cache缓存

cache与主存之间是以块为单位读写的,这样设计是为了符合程序运行的局部性原理--时间局部性原理与空间局部性原理(参见《计算机组成原理》)

二维数组行遍历比列遍历要快,是由于二维数组是按行存储的,cache从主存中读入块,会将同行相邻元素一起写入cache,导致行遍历cache命中率大于列遍历cache命中率。

public class CacheTest {

    static final int LINE_NUM = 1024;
    static final int COLUMN_NUM = 1024;

    public static void main(String[] args){
        long [][] array = new long[LINE_NUM][COLUMN_NUM];
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < LINE_NUM; i++){//行遍历
            for (int j = 0; j < COLUMN_NUM; j++){
                array[i][j] = i*2 + j;
            }
        }
        long endTime = System.currentTimeMillis();
        long cacheTime = endTime - startTime;
        System.out.println("cache time :" + cacheTime);

        startTime = System.currentTimeMillis();
        for (int j = 0; j < COLUMN_NUM; j++){//列遍历
            for (int i = 0; i < LINE_NUM; i++){
                array[i][j] = i*2 + j;
            }
        }
        endTime = System.currentTimeMillis();
        System.out.println("no cache time :" + (endTime - startTime));
    }
}

二、伪共享

伪共享:当一个cache行中有多个变量,多线程不能同时修改更新这多个变量。导致多线程的串行运行

    /*
    * 解决伪共享方法一:cache行为64B,对象头8B,加上变量8B,加上填充的6个无用变量48B,达到一个cache行对应一个变量
    *
    */
    public final static class FiledLong{
        public volatile long value = 0L;
        public long p1,p2,p3,p4,p5,p6;
    }
    /*
     * 解决伪共享方法二:sun.misc.Contended注解
     *
     */
    @Contended
    public final static class FiledLong2{
        public volatile long value = 0L;
    }

cache缓存与伪共享

标签:out   程序   rgs   vol   color   元素   misc   修改   命中   

原文地址:https://www.cnblogs.com/wqff-biubiu/p/12154570.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!