首页 > 其他分享 >【CacheLine】关于缓存行的笔记(存疑)

【CacheLine】关于缓存行的笔记(存疑)

时间:2023-05-05 20:36:02浏览次数:43  
标签:1024 arr 缓存 int System long CacheLine 存疑

什么是缓存行

Cache是由很多个cache line组成的。每个cache line通常是64字节,并且它有效地引用主内存中的一块儿地址。一个Java的long类型变量是8字节,因此在一个缓存行中可以存8个long类型的变量。

CPU每次从主存中拉取数据时,会把相邻的数据也存入同一个cache line。

在访问一个long数组的时候,如果数组中的一个值被加载到缓存中,它会自动加载另外7个。因此你能非常快的遍历这个数组。事实上,你可以非常快速的遍历在连续内存块中分配的任意数据结构。

下面的例子是测试利用cache line的特性和不利用cache line的特性的效果对比。

代码示例来源于:https://tech.meituan.com/2016/11/18/disruptor.html

public class CacheLineEffect {

    //考虑一般缓存行大小是64字节,一个 long 类型占8字节
    static  long[][] arr;
    static int size = 8;

    public static void main(String[] args) {
        arr = new long[1024 * 1024][];
        for (int i = 0; i < 1024 * 1024; i++) {
            arr[i] = new long[size];
            for (int j = 0; j < size; j++) {
                arr[i][j] = 0L;
            }
        }
        long sum = 0L;
        long marked = System.currentTimeMillis();
        for (int i = 0; i < 1024 * 1024; i+=1) {
            for(int j =0; j< size;j++){
                sum = arr[i][j];
            }
        }
        System.out.println("Loop times:" + (System.currentTimeMillis() - marked) + "ms");

        marked = System.currentTimeMillis();
        for (int i = 0; i < size; i+=1) {
            for(int j =0; j< 1024 * 1024;j++){
                sum = arr[j][i];
            }
        }
        System.out.println("Loop times:" + (System.currentTimeMillis() - marked) + "ms");
    }
}

在本机上测试的结果:
Loop times:12ms
Loop times:45ms


按上面的例子,一般来说,两层的for循环,是希望外层少,内层多。
但尝试了一下,这个理论用在这里貌似并不适用。
即使 size 不是8, 换成10之后,也还是一样,仿佛并没有证明到缓存行的效果?
反倒是 两层 for 循环的区别?。。。。

数组
Loop times:21ms
Loop times:60ms


尴尬了。。。先留个疑惑,吧。

标签:1024,arr,缓存,int,System,long,CacheLine,存疑
From: https://www.cnblogs.com/aaacarrot/p/17375284.html

相关文章

  • nginx的反向代理缓存
    #proxy_cache_path设置缓存保存的目录#keys_zone设置共享内存以及占用的空间大小#max_size设置缓存大小#inactive超过此时间,则缓存自动清理#use_temp_path关闭临时目录proxy_cache_path/usr/local/nginx/upstream_cachekeys_zone=myca......
  • Swift下Data处理全流程:从网络下载,数模转换,本地缓存到页面使用
    Swift下将网络返回json数据转换成struct假如网络请求返回的数据结构是一个深层嵌套的Json首先要通过key-value取出这个json中的数据源//将返回的json字符串转Dictoryletjson="""{"name":"jack","age":20,"description":"Astudent."......
  • nginx控制浏览器缓存
    创建一个html文件vimcache.html<html><body><h1>Hello,Nginx~!~</h1></body></html>配置conf文件,这里配置在imooc.conf,可以自定义location/static{alias/home/imooc;}检查语......
  • 说透 Spring循环依赖和3级缓存
    Bean加载的总体流程FactoryBean的使用地位:FactoryBean接口是Spring重要的拓展接口用途:用于复杂的初始化或者框架集成使用:自定义类继承接口FactoryBean原理:spring的getBean方法会回调FactoryBean的getObject方法缓存中获取单例bean说明下3级缓存指的是什么:map的名称完整性几级缓存......
  • google浏览器如何禁用缓存cache?
    1.打开开发者模式(F12)或右键检查 2.点击设置--点击禁用缓存 3.这样在每次打开检查这个窗口的时候,就不会加载缓存。方便调试。......
  • 【SpringBoot系列】七、SpringBoot 中使用Redis缓存
        在项目中对数据的访问往往都是直接访问数据库的方式,但如果对数据的访问量很大或者访问很频繁的话,将会对数据库来很大的压力,甚至造成数据库崩溃。为了解决这类问题redis数据库脱颖而出,redis数据库出现时是以非关系数据库的光环展示在广大程序猿的面前的,后来redis的迭代版......
  • MyBatis-第三方缓存
    第三方缓存整合ehcache.xml<?xmlversion="1.0"encoding="UTF-8"?><ehcachexmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"><!--磁盘保存路径-->......
  • B/S 结构系统的 缓存机制(Cookie) 以及基于 cookie 机制实现 oa 十天免登录的功能
    B/S结构系统的缓存机制(Cookie)以及基于cookie机制实现oa十天免登录的功能@目录B/S结构系统的缓存机制(Cookie)以及基于cookie机制实现oa十天免登录的功能每博一文案1.Cookie的概述2.session与Cookie之间的联系:3.Cookie的作用:4.Cookie的生成机理的原理:5......
  • 使用 SpringCache 简化缓存代码实现
    SpriingCache实现了基于注解的缓存功能,只需要在方法上添加注解即可实现常用的缓存功能,大大简化了的业务代码的实现。SpringCache默认集成于SpringContext中,这意味着对于使用SpringBoot框架来说,不需要引入额外的jar包即可使用。SpringCache通过CacheManager接口来统一......
  • Hibernate缓存机制
      Hibernate缓存分类:Hibernate的缓存范围 事务范围的缓存只能被当前事务访问,每个事务都有各自的缓存,缓存内的数据通常采用相互关联的对象形式.缓存的生命周期依赖于事务的生命周期,只有当事务结束时,缓存的生命周期才会结束.事务范围的缓存使用内存作......