Java程序性能优化——性能指标

性能概述

为什么程序总是那么慢?它现在到底在干什么?时间都花到哪里去了?也许,你经常会抱怨这些问题。如果是这样,那说明你的程序出了性能问题。和功能性问题相比,性能问题在有些情况下,可能并不算什么太大的问题,将就一下,就过去了!但是,严重的性能问题会导致程序瘫痪、假死。直至崩溃。本节就先来认识性能的各种表现和指标。

看懂程序的性能

读客户端程序而言,拙劣的性能会严重影响用户体验:界面停顿、抖动(非动作特效)、响应迟钝等问题会遭到用户不停的抱怨。一个典型的例子就是Eclipse IDE工具在Full GC时会出现程序假死现象,相信一定不少开发人员所诟病。对于服务器程序来说,性能问题则更为重要,相信不少后台服务软件都有各自的性能目标。以Web服务器为例,服务器的响应时间、吞吐量下降,甚至是抛出内存溢出异常而崩溃。这些问题,都是性能调优需要解决的。

一般来说,程序的性能通过以下几个方面来表现:

□执行速度:程序的反应是否迅速,响应的时间是否足够短。

□内存分配:内存分配是否合理,是否过多地消耗内存或者存在泄漏。

□启动时间:程序从运行到可以正常处理业务需要花费多长时间。

□负载承受能力:当系统压力上升时,系统的执行速度、响应时间的上升曲线是否平缓。

性能的参考指标

为了能够科学地进行性能分析,对性能指标进行定量评测是很重要的。目前,一些可以用于定量评测的性能指标有:

□执行时间:一段代码从开始运行到运行结束,所使用的时间。

□CPU时间:函数或者线程占用CPU的时间。

□内存分配:程序在运行时占用的内存空间。

□硬盘吞吐量:描述I/O的使用情况。

□网络吞吐量:描述网络的使用情况。

□响应时间:系统对某用户行为或者事件做出应答的时间。响应时间越短,性能越好。

木桶原理与性能瓶颈

木桶原理又称“短板理论”,其核心思想是:一个木桶盛水的多少,并不取决于桶壁上最高的那块木块,而是取决于桶壁上最短的那块。将这个理论应用到系统性能优化上,可以这么理解,即使系统拥有充足的内存资源和CPU资源,但是如果磁盘I/O性能低下,那么系统的总体性能是取决于当前最慢的磁盘I/O速度,而不是当前最优越的CPU或内存。在这种情况下,如果需要进一步提升系统性能,优化内存或者CPU资源都是毫无用处的。只有提高磁盘I/O性能才能对系统的整体性能进行优化,而此时,磁盘的I/O就是系统的性能瓶颈。

注:根据木桶原理,系统的最终性能取决于系统中性能表现最差的组件,因此,为了提升系统整体性能,必须对系统中变现最差的组件进行优化,而不是对系统中表现良好的组件进行优化。

根据应用的特点不同,任何计算机资源都有可能成为系统瓶颈。其中,最有可能成为系统瓶颈的计算资源如下。

1.磁盘I/O:由于磁盘I/O读写的速度要比内存满很多,程序在运行过程中,如果需要等待磁盘I/O完成,那么低效的I/O操作会拖累整个系统。

2.网络操作:对网络数据进行读写的情况与磁盘I/O类似。由于网络环境的不确定性,尤其是对互联网上数据的读写,网络操作的速度可能比本地磁盘I/O更慢。因此,如不加特殊处理,也极可能成为系统瓶颈。

3.CPU:对计算资源要求较高的应用,由于其长时间、不间断地大量占用CPU资源,那么对CPU的争夺将导致性能问题。如科学计算、3D渲染等对CPU需求旺盛的应用。

4.异常:对Java应用来说,异常的捕获和处理是非常消耗资源的。如果程序高频率地进行异常处理,则整体性能便会明显下降。

5.数据库:大部分应用程序都离不开数据库,而海量数据的读写可能是相当费时的。而应用程序可能需要等待数据库操作完成或者返回请求的结果集,那么缓慢的同步操作将成为系统瓶颈。

6.锁竞争:对高并发程序来说,如果存在激烈的锁竞争,无意识对性能极大的打击。锁竞争将会明显增加线程上下文切换的开销。而且,这些开销都是与应用需求无关的系统开销,白白占用宝贵的CPU资源,却不带任何好处。

7.内存:一般来说,只要应用程序设计合理,内存在读写速度上不太可能成为性能瓶颈。除非应用程序进行了高频率的内存交换和扫描,但这些情况比较少见。使内存制约系统性能的最可能的情况是内存大小不足。与磁盘相比,内存的大小似乎小的可怜,这就意味着应用软件只能尽可能将常用的核心数据读入内存,这在一定程度上降低了系统性能。

Amdahl定律

Amdahl定律是计算机科学中非常重要的定律,它定义了串行系统并行化后加速比的计算公式和理论上限。加速比定义:加速比=优化前系统耗时/优化后系统耗时所谓加速比,就是优化前的耗时与优化后耗时的比值。加速比越高,表明优化效果越明显。Amdahl定律给出了加速比与系统并行度和处理器数量的关系。假设加速比为Speedup,系统内必须串行化的程序比重为F,CPU处理器数量N,则有:

Speedup≤ 1/(F+(1-F)/N)

例:在双核处理器下,某程序执行步骤包含5个步骤,其中3个步骤是必须串行,因此其串行化比重为F=3/5=0.6,N=2。根据这个公式,如果CPU处理器数量趋于无穷,那么加速比与系统的串行化率成反比,如果系统中必须有50%代码串行执行,那么系统的最大加速比为2。

注:根据Amdahl定律,使用多核CPU对系统进行优化,优化的效果取决于CPU的数量以及系统中的串行化比重,CPU数量越多,串行化比重越低,则优化效果越好,仅提高CPU数量而不降低程序的串行化比重,也无法提高系统性能。

以上文字整理自:  [Java程序性能优化-.让你的Java程序更快、更稳定].葛一鸣等编著

【转载使用,请注明出处:http://blog.csdn.net/mahoking

时间: 2024-10-08 10:28:50

Java程序性能优化——性能指标的相关文章

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

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

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程序性能优化:代码优化

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

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

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

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

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

《Java程序性能优化》学习笔记 Ⅳ JVM调优

第五章 JVM调优5.1 Java虚拟机内存模型1.JVM虚拟机将其内存数据分为程序计数器.虚拟机栈,本地方法栈,Java堆,和方法去等部分.5.2 JVM内存分配参数5.3 垃圾收集基础5.4 常用调优案例和方法5.5 使用JVM参数5.6 实战JVM调优 <Java程序性能优化>学习笔记 Ⅳ JVM调优

Java程序性能优化-概述

前言 这两天在看<Java程序性能优化>这本书,将我学到的书上好的东西分享给大家.做过开发的人应该或多或少都碰到过性能问题,遇到性能问题你是怎么做的呢?你能看懂程序的性能吗?本篇给大家讲下如何看懂程序的性能及性能的参考指标. 正题 程序性能的表现方式: 1.执行速度:程序的反映是否迅速,响应时间是否足够短. 执行速度可以受到多方面的影响,比如逻辑写的有问题,查询数据量大,网络问题等等. 2.内存分配:内存分配是否合理,是否过多地消耗内存或者存在泄漏. 要根据程序的运行情况及服务器内存大小合理分