当前位置: 代码迷 >> C# >> 关于使用CPU缓存的一个小板栗
  详细解决方案

关于使用CPU缓存的一个小板栗

热度:33   发布时间:2016-05-05 04:25:14.0
关于使用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 }

 

四、栗子结果

 

五、结论

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

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

1楼Sunwayking
第二个栗子,大循环在小循环外面这才是大忌,很大的原因也是出在这里,你可以试试不在循环里操作数组,结果也是第二个栗子比第一个栗子慢很多,这主要涉及一个CPU指令预测的机制。,,另外,对于存储器来说,顺序访问比随机访问速度快。
  相关解决方案