1:多余的存储引用导致性能减少。

2:利用局部性提高程序性能;

先来说说引用是怎么减少程序性能。个人觉得减少程序性能主要有两个原因,一是数据结构选择不合理,二是多层嵌套循环导致部分代码被多余反复执行。在另外一种情况下我们一般都是优化循环最里层的代码,能提出来的尽量往外层提,实在不行的就优化它的执行速度。

1:多余的存储引用导致性能减少

先来看一个关于引用导致性能减少的问题。以下两个方法哪个更快。

static void Test2(ref int sum)
{
for (int i = 1; i <= timer; i++)
{
sum += i;
}
} static void Test3(ref int sum)
{
int tmpSum = sum;
for (int i = 1; i <= timer; i++)
{
tmpSum += i;
}
sum = tmpSum;
}

大致一看他们的性能应该没有区别,由于这两个方法事实上就是利用一个循环求和,而真正能影响方法的性能就是这个循环。且两个方法的循环表面上看能够说是一样的。当,我令timer=10000000时,即求1+2+…+10000000的和。方法Test3的速度比Test2快。是的,Test3比Test2快,在某个区间内timer越大。性能区别越大。执行结构例如以下:

" src="http://www.cgzhw.com/wp-content/uploads/2014/08/13170935-21fcefcd83cf41f0b0fcca7b3def3719.png" style="">

咱们直接来看反汇编代码。部分反汇编代码例如以下,我们仅仅用看红线框着的部分。

" alt="C++研究之在开发中你可能没有考虑到的两个性能优化具体解释(二十五) - 第2张 | 成功智慧网-最好的游戏编程开发技术站点!" src="http://www.cgzhw.com/wp-content/uploads/2014/08/13171035-b5dc73ee74164eaaa964a8f54194267b.png" style="">

最基本的一句代码:sum+=i;方法Test2例如法Test3多了最后面一行,即将每次循环后求得的和回写到内存中,方法Test3却不用这么麻烦,仅仅用一个寄存器,每次求得的和写到寄存器中。求完和后一次将和写到内存中。在每次循环中。Test2要读两次内存(sum和i都从内存中读),写一次内存(将求得的和写到内存中),而方法Test3仅仅须要读一次内存,即从内存中读i的值。方法Test3的性能比Test2高就不言而喻了。就由于Test2每次都是以引用的方式读sum的值。CPU要得到sum的值,就得通过sum在内存中的地址。所以必读内存,,而Test3不必读内存。用一个寄存器就可以。

技术提高的訪问www.cgzhw.com 游戏编程网非常不错的技术站点。

2:利用局部性提高程序性能。

还是直接看一个简单的样例

static int Test4(int[,] arr, int row, int column)
{
int sum = 0;
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
sum += arr[i, j];
}
}
return sum;
} static int Test5(int[,] arr, int row, int column)
{
int sum = 0;
for (int j = 0; j < column; j++)
{
for (int i = 0; i < row; i++)
{
sum += arr[i, j];
}
}
return sum;
}

简单一个看,两个方法差点儿是全然一样,不同的是Test4是按行求和,而Test5是按列求和。

假设多次执行这两个方法进行。对照就会方法Test4的性能高于Test5。

执行两个方法100000次,结果例如以下:

为什么按行求和比按列求和快呢?简单一句话:数组是按行存的。

CPU每次从内存读数据。不是要哪个就读哪个就直接读哪个,而是每次读一个快速缓存行。就是每次要多读一些,如。果须要的数据在快速缓存行中,就不用到内存中去读了,而是直接从快速缓存行中取。当然就比再从内存中读取要快一些。而在这里,数组按行存储,也就是说,CPU每次会读多个数组元素导快速缓存行,假设须要的元素在快速缓存行中就不用到内存中去取了,这就是传说中的命中率,按行求和命中率当然就高了。

而按列求和,命中率自然低,CPU每次将一行中的多个元素读到快速缓存行中,按列求和每次仅仅须要一个元素,也就是每次仅仅须要一个元素而CPU却读了多个元素,命中率当然低,低到可能出现命中率为0。

程序的局部性包含:空间局部性和时间局部性,这里说的就是空间局部性。

空间局部性就是说一个被使用的到数据其周围的数据非常可能会被立即使用。

时间局部性就是说一个被使用的到数据非常可能会被再次使用。

最新文章

  1. IOS Socket 01-网络协议基础知识
  2. [iOS 主要框架的总结]
  3. 【hibernate 报错】No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer 【get和load的区别】
  4. 连接mongo的服务提示:HTTP Status 500 - com.mongodb.MongoException$Network: can't call something
  5. Fisher information matrix笔记
  6. HighCharts 根据spline-plot-bands图,定制自己的图(区间里显示多个数据)
  7. 研究一下FBrush,它是从TWinControl才有的属性(可能是因为需要句柄)——发现{$R *.dfm}在运行期执行,而且很有深意,读到属性后赋值还会触发事件,这些无法在VCL代码里直接看到
  8. Vijos P1127 级数求和【模拟】
  9. 笔记:Maven 项目目录结构
  10. Activtiy完全解析(二、layout的inflate过程)
  11. 初学高级程序设计 shell编程
  12. [Python]基础教程(2)、PyCharm安装及中文编码
  13. update 中实现子查询
  14. windows安装mysql 5.7
  15. python XML梳理
  16. MySQL 存储过程中执行DDL
  17. MongoDB基本管理命令 [转]
  18. uart 超声波传感器数据读取
  19. iOS开发之iOS界面UI
  20. Codeforces461A Appleman and Toastman 贪心

热门文章

  1. E20170906-mk
  2. img标签间距问题
  3. 迭代,IDA*
  4. flume+flume+kafka消息传递+storm消费
  5. rancher导入k8s集群后添加监控无数据
  6. jdbc 接口学习笔记
  7. Laravel5.1学习笔记7 视图
  8. 【SQL】CONNECT BY 层次化查询
  9. WEB笔记-5、字体和文本
  10. MVC POST请求后执行javascript代码