程序性能优化

作为一个性能癖,关于程序优化的奥秘怎能错过? 咱么可以将优化分为三个层次:

   1、High-level design:即选择适当的数据结构和算法。

  2、Basic code principles:注意避免两个optimization blockers,使编译器可以顺利优化。还要注意尽量不要使用连续的函数调用和不必要的内存访问。中间值就不要写入内存了,求得最终值再来写入。

  3、Low-level optimizations:unroll loops即通过增加每次循环中处理的元素个数以减少迭代次数;通过multiple accumulators(比如说将奇数项和偶数项分开算)或reassociation(类似结合律)来提高instruction-level parallelism。这需要对存储器的微结构有所了解。除此之外,还可以将conditional jump用conditional move代替。

一些概念:

   这里衡量性能的标准主要是CPE(cycles per element),即增加一个元素需要相应增加的时钟周期,自然是越小越好。 性能的制约主要有两个:latency bound 和throughput bound,前者是指指令必须按严格顺序执行,这样就限制了处理器对instruction-level parallelism的利用;而后者就关乎你处理器的硬实力了,除了投入更多的人民币以外,我们对它也无能为力 =。=

  有了parallelism后,多条pipeline可以同时执行。决定性能的关键在于那一条critical path,即在该路径上每一次的迭代必须等前一次迭代执行完才可继续。若要优化自然要抓住這个主要矛盾! conditional move的好处: 高级语言中类似于if, while, for等语句,对应于汇编中的conditional jump,即jb, jne之类的分支结构。cpu一般会进行branches predictions来发挥其pipeline的作用,而预测都是分支会被执行。一般情况下,比如说 while ( i < n ) 这种,就只有最后一次错误,所以总的来说分支预测能起到不错的优化效果。但是如果使预测正确的可能性不高的情况下,比如说有个数组a[i],它的元素是任意整数,那么判断条件为if ( a[i] > 0 )时,只有一半的几率正确。这样每次misprediction都要将已经并发执行的指令回退,这些penalities累积起来,后果不堪设想。

   解决办法使使用conditional move取代conditional branch。具体如下

优化前代码片段:

void max( int a, int b){
   int i;
  if ( a > b)
   i = a;
  else
      i = b;
}

改成:

void max ( int a, int b){
  int i = a > b ? a : b;
}

后面这种情况下,处理器会计算出a, b 的值,然后再根据判断条件是否为真来赋给i。虽然要多计算一个值,但是这里的额外开销远小于分支预测错误的额外开销。

write/read dependency:

  书上写the load unit can only initiate one load operation every clock cycle,所以有内存写入的操作一定要等到前一次内存写入完成。在内存写入后接着进行内存读取自然不是明智的选择。应尽量避免内存的读写依赖。将中间值存在临时变量中,最终值才写入内存。

Program Profiling:

  如果是一个大的程序,我们需要借助一些工具来进行分析,找出可以优化的部分。GPROF可以分析函数调用,我们就可以针对调用次数多或调用周期长的函数进行优化。在linux下可以使用valgrind来分析。

   最后介绍一个有意思的定律叫Amdahl‘s Law,这里包含一个计算整体优化度的公式。它主要使说如果我们要提高整体的优化度,必须对大部分都进行优化。对小局部即使进行优化度很高的优化,它能给整体带来的性能提升也非常局限。

时间: 2024-11-09 21:30:58

程序性能优化的相关文章

Java程序性能优化——性能调优层次

为了提升系统性能,开发人员可以从系统的各个角度和层次对系统进行优化.除了最常见的代码优化外,在软件架构上.JVM虚拟机层.数据库以及操作系统层都可以通过各种手段进行调优,从而在整体上提升系统的性能. 设计调优 设计调优处于所有调优手段的上层,它往往需要在软件开发之前进行.在软件开发之初,软件架构师就应该评估系统可能存在的各种潜在的问题,并给出合理的设计方案.由于软件设计和架构对软件整体有决定性的影响,所以,设计调优对系统性能的影响也是最大的.如果说,代码优化.JVM优化都是对系统微观层面上"量&

程序性能优化之SQL篇

如果说功能是程序的躯体,那么性能就是程序的灵魂.完整的功能可以保证程序的躯体是健全的,而良好的性能才是程序灵魂的象征,本文就程序的性能优化做简单的介绍. 最近对程序的性能的体会尤为深刻.最近做了一个数据查询和显示的功能,从7张表大概1500条数据中查询25条数据并且显示出来,时间消耗1秒钟.我的计算机参数为:CPU:i5处理器,4G内存.这个执行速度相当的慢,好在我查询的数据量比较小,等待时间不是很多,但是程序性能优化确实刻不容缓. 仔细分析了程序,发现有很多地方都是需要修改的,我们先从数据库开

Java程序性能优化技巧

多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for循环Vector vect = new Vector(1000);for( inti=0; i<vect.size(); i++){ ...}for循环部分改写成:int size = vect.size();for( int i=0; i>size; i++){ ...} 如果size=1000,就可以减少1000次si

《Java程序性能优化》学习笔记 Ⅰ设计优化

豆瓣读书:http://book.douban.com/subject/19969386/ 第一章 Java性能调优概述 1.性能的参考指标 执行时间: CPU时间: 内存分配: 磁盘吞吐量: 网络吞吐量: 响应时间: 2.木桶定律   系统的最终性能取决于系统中性能表现最差的组件,例如window系统内置的评分就是选取最低分.可能成为系统瓶颈的计算资源如,磁盘I/O,异常,数据库,锁竞争,内存等. 性能优化的几个方面,如设计优化,Java程序优化,并行程序开发及优化,JVM调优,Java性能调

[JAVA] java程序性能优化

一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子: import java.util.vector; class cel { void method (vector vector) { for (int i = 0; i < vector.size (); i++) // violation ; // ... } } 更正: class cel_fixed { void metho

Java程序性能优化之代理模式

代理模式的用处很多,有的是为了系统安全,有的是为了远程调用,这里我们,主要探讨下由于程序性能优化的延迟加载. 首先我们来看下代理模式设计 先首先简单阐述下什么叫代理模式吧 代理设计模式有一个接口,另外还有真实主题类和代理类,真实类和代理类都实现了接口,代理类和真实主题类是关联和聚合关系.客户端与接口关联. 代理分为静态代理和动代态代理所谓静态代理是为真实主题手动创建一个代理,而动态代理则是jvm在运行时运用字节码加载技术自动创建一个代理,并不用关心接口和真是主题类 具体如何实现 哦,对了差点忘了

Java程序性能优化:代码优化

现在计算机的处理性能越来越好,加上JDK升级对一些代码的优化,在代码层针对一些细节进行调整可能看不到性能的明显提升, 但是我觉得在开发中注意这些,更多的是可以保持一种性能优先的意识,对一些敲代码时间比较短的同学挺有意义的. 一 循环条件下,循环体和判断条件中,都要避免对使用复杂表达式,减少对变量的重复计算 1.在循环中应该避免使用复杂的表达式. 在循环中,循环条件会被反复计算,应该避免把一些计算放在循环进行的部分中,程序将会运行的更快.比如: for(int i=0;i<list.size();

关于程序性能优化基础的一些个人总结

性能点: I/O,系统调用,并发/锁,内存分配,内存拷贝,函数调用消耗,编译优化,算法 I/O性能优化: I/O性能主要耗费点:系统调用,磁盘读写,网络通讯等 优化点:减少系统调用次数,减少磁盘读写次数,减少阻塞等待 优化手段: a. 使用非阻塞模式 b. 使用带缓存的I/O,减少磁盘读写次数 c. I/O多路复用,select/poll/epoll d. 异步I/O 系统调用: 耗费点:用户态和系统态切换时耗 优化点:减少不必要的系统调用 优化手段: a. I/O操作,根据具体情况,使用std

Java程序性能优化——设计优化

原文出自:http://blog.csdn.net/anxpp/article/details/51914119,转载请注明出处,谢谢! 1.前言 OK,之前写了一篇文章:"23种设计模式介绍以及在Java中的应用"详细介绍了如何将设计模式应用到Java编程中,而本文旨在介绍如何利用他们优化我们的程序,使其性能更佳. 设计模式的详细介绍请参照上面链接中的文章,不是本文的重点. 而Java程序的性能优化,不一定就仅仅是以提高系统性能为目的的,还可能是以用户体验.系统可维护性等为目的. 2

《Java程序性能优化:让你的Java程序更快、更稳定》

Java程序性能优化:让你的Java程序更快.更稳定, 卓越网更便宜,不错的书吧