zoukankan      html  css  js  c++  java
  • 关于使用CPU缓存的一个小栗子

    一、背景知识

    CPU缓存(Cache Memory),是位于CPU与内存之间的临时存储器,它的容量比内存小的多但是交换速度却比内存要快得多。高速缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速度要比内存读写速度快很多,这样会使CPU花费很长时间等待数据到来或把数据写入内存。在缓存中的数据是内存中的一小部分,但这一小部分是短时间内CPU即将访问的,当CPU调用大量数据时,就可避开内存直接从缓存中调用,从而加快读取速度。

    ----以上引自度娘百科,懒呐- -"

    缓存中是由缓存行来管理的,典型的缓存行大小为64bytes,一次读入就是64bytes。即使仅仅想读入一个Int64,实际上也是将其后的56bytes也读进来。

    因此如果需要操作一个Length为8的Int64数组,一次读入,次次命中,嗨吧~~

    二、栗子

    设计了一个小栗子,是累加一个二维Int64的数据:

    如果从一维循环,那么类似于顺序读入,这样应该能实现1次读入缓存,后7次命中,性能应该会好一些。

    如果从二维循环,那么读入一次缓存,后面的就没办法命中了,性能一定是底很多。

    三、栗子代码

     1 using System;
     2 
     3 namespace PerformanceOfCacheLineTest
     4 {
     5     class Program
     6     {
     7         private const Int64 ONE_DIMENSION = 1024 * 1024;
     8         private const Int64 TWO_DIMENSION = 64;
     9 
    10         static void Main(string[] args)
    11         {
    12             Int64[][] array = new Int64[ONE_DIMENSION][];
    13             for (int i = 0; i < ONE_DIMENSION; i++)
    14             {
    15                 array[i] = new Int64[TWO_DIMENSION];
    16                 for (int j = 0; j < TWO_DIMENSION; j++)
    17                 {
    18                     array[i][j] = 0;
    19                 }
    20             }
    21 
    22             Console.WriteLine("starting....");
    23 
    24             DateTime start = System.DateTime.Now;
    25             Int64 sum = 0;
    26             for (int i = 0; i < ONE_DIMENSION; i++)
    27             {
    28                 for (int j = 0; j < TWO_DIMENSION; j++)
    29                 {
    30                     sum += array[i][j];
    31                 }
    32             }
    33             DateTime end = System.DateTime.Now;
    34             Console.WriteLine("one dimension first: using " + (end - start).TotalMilliseconds);
    35 
    36 
    37             start = System.DateTime.Now;
    38             for (int j = 0; j < TWO_DIMENSION; j++)
    39             {
    40                 for (int i = 0; i < ONE_DIMENSION; i++)
    41                 {
    42                     sum += array[i][j];
    43                 }
    44             }
    45             end = System.DateTime.Now;
    46             Console.WriteLine("two dimension first: using " + (end - start).TotalMilliseconds);
    47 
    48             Console.WriteLine("...ended");
    49             Console.Read();
    50         }
    51     }
    52 }

    四、栗子结果

    五、结论

    差距还是很明显的哟,印证了假设。

    作为一枚肉鸟,学到新的东西总是让人耳目一新,世界观都不一样了呢*_*。。。需要学习的东西还很多呀!!!

  • 相关阅读:
    Chapter01_前言、入门程序、常量、变量
    面向对象知识点总结
    Java快捷键
    上线
    docker
    分页,过滤,搜索,排序
    Celery
    django-redis 缓存使用
    前台登录注册修订
    短信注册接口
  • 原文地址:https://www.cnblogs.com/DexterDi/p/4371613.html
Copyright © 2011-2022 走看看