- 论坛徽章:
- 2
|
本帖最后由 cdsfiui 于 2017-04-23 10:48 编辑
书上说x86的缓存行默认是64字节,所以我有下面的测试代码:
- #include<sys/time.h>
- #include<stdlib.h>
- #include<stdio.h>
- size_t cacheline=16;
- int main(int argc,char*argv[]){
- size_t loopCount=2000000000;
- if(argc==2){loopCount=atol(argv[1]);}
- printf("loop=%ld\n",loopCount);
- int array[cacheline];
- for(size_t a=0;a<cacheline;++a){
- array[a]=a;
- }
- size_t c=0;
- long sum=1;
- for(size_t i=0;i<loopCount;++i){
- if(c==cacheline)c=0;
- sum+=array[c++];//array应该始终
- }
- printf("sum=%ld\n",sum);
- return 0;
- }
复制代码
我期待的是,cacheline小于等于64的时候,int array这个数组会在操作的时候,全部缓存在同一个cacheline里面,性能没有变化。
而当大于64的时候,会有一次大幅度的降低。
但是我用了clang和gcc编译,结果发现不论是16,还是64,还是256,还是65536,结果都一样。无法理解。
- clang++ test07_cacheline.cpp -O2 -o test07_cacheline && time ./test07_cacheline 2000000000
复制代码
为什么cacheline这个参数的设定,对于性能的影响在我的程序里面没有体现出来? 求解释。
当cacheline=65536的时候,这个应该包含了很多个缓存行了吧,应该有很多cache invalidate发生? 但是我的测试结果还是没变啊 |
|