1 / 4
文档名称:

处理器缓存.doc

格式:doc   页数:4页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

处理器缓存.doc

上传人:xxj16588 2016/3/6 文件大小:0 KB

下载得到文件列表

处理器缓存.doc

相关文档

文档介绍

文档介绍:请注意, 本文不是讲解处理器缓存, 如果你对 cpu cache 这个概念不清楚, 请先 Google 一下。另外, 本文主要针对像 C, C++ 这种产生机器码的语言的, 对于像 Java , .Net 这样的字节码语言,这里所说的可能无效,至少我没研究过。首先说说我所说的这些旧有的优化技巧从哪里来的。原因很简单,如果你像我一样,多年只用 J2ME ,或者 Flash 这样的技术开发,你是不太可能会关心处理器缓存的,而是用一些其它的性能技巧,这些技巧遇到处理器缓存问题,就失效了。再如果你的 CPU , 汇编, 优化知识像我一样仍停留在 80386 时代, 你我掌握的优化技巧断然也是过时的。失效技巧一,使用预先计算好的变量或者查找表现在来怎么用查找表来计算一个 32 位整数里位为 1 的个数。 static const unsigned char BitsSetTable256[256] = { // 预先计算好的 256 个8 位数的 1 的个数}; int calculateBitsCount(unsigned int n) { unsigned char *p= (unsigned char *)&n; return BitsSetTable256[p[0]] + BitsSetTable256[p[1]] + BitsSetTable256[p[2]] + BitsSetTable256[p[3]]; } static const unsigned char BitsSetTable256[256] = { // 预先计算好的 256 个8 位数的 1 的个数}; int calculateBitsCount(unsigned int n) { unsigned char *p= (unsigned char *)&n; return BitsSetTable256[p[0]] + BitsSetTable256[p[1]] + BitsSetTable256[p[2]] + BitsSetTable256[p[3]]; } 很酷, 是吧, 只用了四次加法运算, 我们可以想当然地认为这个算法比那些充满乘除法甚至循环的算法快。但当有了 CPU 的数据缓存, 情况不一样了。当 calculateBitsCount 第一次取 BitsSetTable256 数据, 很有可能导致数据缓存清空重新加载 BitsSetTable256 位置的内存, 会导致浪费上百指令周期,而这上百指令周期,足够用普通方法计算位数了。比如下面这个算法,来自 /~seander/ unsigned int v; // count the number of bits set inv unsigned int c; //c accumulates the total bits set inv for (c= 0; v; c++) {v &= v- 1; // clear the least significant bit set } unsigned int v; // count the number of bits set inv unsigned int c; //c accumulate