写Java也得了解CPU–CPU缓存

发表于:2015-7-29 09:22

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:macemers    来源:51Testing软件测试网采编

  CPU,一般认为写C/C++的才需要了解,写高级语言的(Java/C#/pathon…)并不需要了解那么底层的东西。我一开始也是这么想的,但直到碰到LMAX的Disruptor,以及马丁的博文,才发现写Java的,更加不能忽视CPU。经过一段时间的阅读,希望总结一下自己的阅读后的感悟。本文主要谈谈CPU缓存对Java编程的影响,不涉及具体CPU缓存的机制和实现。
  现代CPU的缓存结构一般分三层,L1,L2和L3。如下图所示:
  级别越小的缓存,越接近CPU, 意味着速度越快且容量越少。
  L1是最接近CPU的,它容量最小,速度最快,每个核上都有一个L1 Cache(准确地说每个核上有两个L1 Cache, 一个存数据 L1d Cache, 一个存指令 L1i Cache);
  L2 Cache 更大一些,例如256K,速度要慢一些,一般情况下每个核上都有一个独立的L2 Cache;
  L3 Cache是三级缓存中最大的一级,例如12MB,同时也是最慢的一级,在同一个CPU插槽之间的核共享一个L3 Cache。
  当CPU运作时,它首先去L1寻找它所需要的数据,然后去L2,然后去L3。如果三级缓存都没找到它需要的数据,则从内存里获取数据。寻找的路径越长,耗时越长。所以如果要非常频繁的获取某些数据,保证这些数据在L1缓存里。这样速度将非常快。下表表示了CPU到各缓存和内存之间的大概速度:
  从CPU到       大约需要的CPU周期         大约需要的时间(单位ns)
  寄存器          1 cycle
  L1 Cache      ~3-4 cycles                        ~0.5-1 ns
  L2 Cache      ~10-20 cycles               ~3-7 ns
  L3 Cache      ~40-45 cycles               ~15 ns
  跨槽传输                    ~20 ns
  内存      ~120-240 cycles                ~60-120ns
  利用CPU-Z可以查看CPU缓存的信息:
  在linux下可以使用下列命令查看:
  有了上面对CPU的大概了解,我们来看看缓存行(Cache line)。缓存,是由缓存行组成的。一般一行缓存行有64字节(由上图”64-byte line size”可知)。所以使用缓存时,并不是一个一个字节使用,而是一行缓存行、一行缓存行这样使用;换句话说,CPU存取缓存都是按照一行,为最小单位操作的。
  这意味着,如果没有好好利用缓存行的话,程序可能会遇到性能的问题。可看下面的程序:
public class L1CacheMiss {
private static final int RUNS = 10;
private static final int DIMENSION_1 = 1024 * 1024;
private static final int DIMENSION_2 = 6;
private static long[][] longs;
public static void main(String[] args) throws Exception {
Thread.sleep(10000);
longs = new long[DIMENSION_1][];
for (int i = 0; i < DIMENSION_1; i++) {
longs[i] = new long[DIMENSION_2];
for (int j = 0; j < DIMENSION_2; j++) {
longs[i][j] = 0L;
}
}
System.out.println("starting....");
long sum = 0L;
for (int r = 0; r < RUNS; r++) {
final long start = System.nanoTime();
//slow
//            for (int j = 0; j < DIMENSION_2; j++) {
//                for (int i = 0; i < DIMENSION_1; i++) {
//                    sum += longs[i][j];
//                }
//            }
//fast
for (int i = 0; i < DIMENSION_1; i++) {
for (int j = 0; j < DIMENSION_2; j++) {
sum += longs[i][j];
}
}
System.out.println((System.nanoTime() - start));
}
}
}
21/212>
《2023软件测试行业现状调查报告》独家发布~

精彩评论

  • BDYD
    2015-8-06 15:24:30

     **于达校区严格遵循**总部的教学体系,秉承**“教育改变生活”理念,传承**“源自北大,永不妥协的教育品质”精神,集**于达校区多年经验,为上海地区**总部唯一授权软件测试培训中心,是**多课程高质量高就业校区。
    选择上海**,教育改变生活!选择**于达校区,成就你我!

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号