天天看点

基于cache line的Java代码优化一、cache line概念二、测试三、结果

一、cache line概念

在计算机的内部,数据的存储基本都是有三级缓存的。最靠近CPU的存储组件是寄存器,cpu需要的数据以及指令集都是暂时放在寄存器中。当需要磁盘中的数据时就会通过缓存,一级一级的访问,而访问的最小单元就是cache line,cache line的大小是64字节。也就是说cache每次运输数据,会运输64个字节大小的数据。

基于cache line的Java代码优化一、cache line概念二、测试三、结果

二、测试

当只有一个属性x时,两个线程操作的数据(X,Y)会放在同一个cache line里面,而关键字volatile又是线程可见,当其中一个线程改变了值,另一个线程会同步这个改变的值(保证缓存一致性),频繁的进行拉取数据,导致效率不高。

当有多个属性时达到64字节的时候,两个线程操作的数据不会放在同一个cache line,不需要互相的同步。效率就很高了。

public class CacheLineD {
    private static class T{
        // long的数据类型占有8个字节
        //private long x1,x2,x3,x4,x5,x6,x7;
        public volatile long x = 0;
    }
    public static T[] arr = new T[2];

    static {
        arr[0] = new T();
        arr[1] = new T();
    }

    public static void main(String[] args) throws InterruptedException {
        Thread t1 = new Thread(() -> {
            for(long i = 0; i< 1000_0000L; i++) {
                arr[0].x = i;
            }
        });

        Thread t2 = new Thread(() -> {
            for(long i = 0; i< 1000_0000L; i++) {
                arr[1].x = i;
            }
        });

        long start = System.currentTimeMillis();
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(System.currentTimeMillis() -start);

    }
}
           

三、结果

在同一个cache line里面执行的时间是220毫秒。

不在一个cache line里面执行的时间是90毫秒。