打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
a[i][j]与a[j][i]性能差别的原因

a[i][j]与a[j][i]性能差别的原因

分类: linux c语言 695人阅读 评论(3) 收藏 举报
 
     一下内容仅是个人理解,有错误之处,望大家谅解和指正。

a[i][j]使用时间:94s

for( k = 0 ; k <10000 ; k++ )
for( i = 0 ; i<MAX; i++ )
for( j = 0;j < MAX; j++ )
a[i][j] = 0;
a[j][i]使用时间:488s

for( k = 0 ; k <  10000  ; k++ )
for( i = 0 ; i<MAX; i++ )
for( j = 0;j < MAX; j++ )
a[j][i] = 0;
我将两种方法使用gcc生成了汇编代码。使用diff比较只发现了一下四句汇编代码的不同
1c1
<  .file"array.c"
---
>  .file"array1.c"
31c31
<  movl4194352(%esp), %eax
---
>  movl4194356(%esp), %eax
33c33
<  addl  4194356(%esp), %eax
---
>  addl        4194352(%esp), %eax
并且,这四句汇编在这行的时候不会产生性能差别,那性能差别出现在那里。可定不是循环、计算数据产生的差别。差别会出现在内存的访问位置上吗?不会的,内存是随机访问,访问任何一个位置内存的地址的时间应该是一样的。我们现在考虑一下是不是操作系统的缓存的功能。首先,本程序在加载到内存执行、以后除了cpu访问内存之外没有任何的资源消耗。所以说不是系统的问题。想了很久,想到cpu访问数据的时候是以块进行访问的,将取来的数据放到缓存中。因为a[i][i]是顺序访问,所以cpu缓存中的数据可以直接使用,无需再访问内存。而a[j][i]非顺序访问,下一个访问的位置,不在cpu的缓存中。

提议:在写代码的时候
1. 对数组、结构体进行顺序访问。提高缓存的命中率。
2. 减少不必要的判断,提高cpu的分支预测的命中率
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
高访问网站性能和压力综合分析 - worm128的日志 - 网易博客
深入解读:英伟达最强异构平台
性能优化--缓存篇
从JVM并发看CPU内存指令重排序(Memory Reordering)
为什么目前x86的CPU的L1 Cache这么小?
你开发的系统到底可以支撑多少并发访问?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服