性能概述

看懂程序的性能

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

  • 执行速度:程序的反映是否迅速,响应时间是否足够短
  • 内存分配:内存分配是否合理,是否过多地消耗内存或者存在泄漏
  • 启动时间:程序从运行到可以正常处理业务需要花费多长时间
  • 负责承受能力:当系统压力上升时,系统的执行速度、响应时间的上升曲线是否平缓

性能的参考指标

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

  • 执行时间:一段代码从开始运行到运行结束,所使用的时间
  • CPU时间:函数或者线程占用CPU的时间
  • 内存分配:程序在运行时占用的内存空间
  • 磁盘吞吐量:描述I/O的使用情况
  • 网络吞吐量:描述网络的使用情况
  • 响应时间:系统对某用户行为或者事件做出响应的时间。响应时间越短,性能越好

木桶原理与性能瓶颈

木桶原理又称“短板理论”,其核心思想是:一只木桶盛水的多少,并不取决于桶壁上最高的那块木块,而是取决于桶壁上最短的那块。

将这个理论应用到系统性能优化上可以这么理解,即使系统拥有充足的内存资源和CPU资源,但是如果磁盘I/O性能低下,那么系统的总体性能是取决于当前最慢的自盘I/O速度,而不是其他。在这种情况下,如果需要进一步提升系统性能,优化内存或者CPU资源是毫无用处的。只有提高磁盘I/O性能才能对系统的整体性能进行优化。

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

  • 磁盘I/O:由于磁盘I/O读写的速度要比内存慢很多,程序在运行过程中,如果需要等待磁盘I/O完成,那么低效的I/O操作会拖累整个系统
  • 网络操作:对网络数据进行读写的情况与磁盘I/O类似。由于网络环境的不确定性,尤其是对互联网上数据的读写,网络操作的速度可能比本地磁盘I/O更慢。因此,如不加特殊处理,也极有可能成为系统瓶颈
  • CPU:对计算资源要求较高的应用,由于其长时间、不间断地大量占用CPU资源,那么对CPU的争夺将导致性能问题。如科学计算,3D渲染等对CPU需求旺盛的应用
  • 异常:对Java应用来说,异常的捕获和处理是非常消耗资源的。如果程序高频率地进行异常处理,则整体性能便会有明显下降
  • 数据库:大部分应用程序都离不开数据库,而海量数据的读写操作可能是相当费时的,而应用程序可能需要等待数据库操作完成或者返回请求的结果集,那么缓慢的同步操作将成为系统瓶颈
  • 锁竞争:对高并发程序来说,如果存在激烈的锁竞争,无疑是对性能极大的打击。锁竞争将会明显增加线程上下文切换的开销。而且,这些开销都是与应用需求无关的系统开销,白白占用宝贵的CPU资源,却不带来任务好处
  • 内存:一般来说,只要应用程序设计合理,内存在读写速度上不太可能成为性能瓶颈。除非应用程序进行了高频率的内存交换和扫描,但这些情况比较少见。使内存制约系统性能的最可能的情况是内存大小不足。与磁盘相比,内存的大小似乎小的可怜,这意味着应用软件只能尽可能将常用的核心数据读入内存,这在一定程度上降低了系统性能

Amdahl定律

amdahl定律是计算机科学中非常重要的定律,它定义了串行系统并行化后加速比的计算公式和理论上限:

        加速比定义:加速比 = 优化前系统耗时 / 优化后系统耗时

所谓加速比,就是优化前的耗时与优化后耗时的比值。加速比越高,标明优化效果越明显。

amdahl定律给出了加速比与系统并行度和处理器数量的关系。设加速比为S,系统内必须串行化的程序比重为F,CPU处理器数量为N,则有:S <= 1 / F + ( 1 - F ) / N

性能调优的层次

设计调优

设计调优处于所有调优的上层,它往往需要在软件开发之前进行。在软件开发之初,软件架构师就应该评估系统可能存在的各种潜在问题,并给出合理的设计方案。由于软件设计和架构对软件整体质量有决定性的影响,所以,设计调优对系统性能的影响也是最大的。

设计优化的一大显著特点是,它可以规避某一个组件的性能问题,而非改良该组件的实现。比如,系统中组件A需要等待某时间E才出发一个行为。如果组件A通过循环监控不断监测时间E是否发生,其监测行为必然会占用部分系统资源,因此,开发人员必须在监测频率和资源消耗间取得平衡。如果监测太低,虽然资源消耗减少,但是系统实时反应性就会降低。如果进行代码层的调优,就需要优化监测方法的实现以及求得一个最为恰当的监测频率

代码调优

代码调优是在软件开发过程中,或者在软件开发完成后,软件维护过程中进行的对程序代码的改进和优化。代码优化涉及诸多编码技巧,需要开发人员熟悉相关的语言的API,并在合适的场景中正确使用相关API或类库。同时,对算法,数据机构的灵活使用,也是代码优化的重要内容

JVM调优

由于Java软件总是运行在JVM虚拟机上,对JVM虚拟机进行优化也能在一定程度上提升Java程序的性能。JVM调优通常可以在软件开发后期进行,如在软件开发完成,或者在软件开发的某一里程碑阶段。

作为Java软件的运行平台,JVM的各项参数将会直接影响Java程序的性能。比如,JVM的堆大小,垃圾回收策略等

要进行JVM层面的调优,需要开发人员对JVM的运行原理和基本内存结构有一定了解。如堆内存的结构,GC的种类等

数据库优化

对绝大部分应用系统而言,数据库是必不可少的一部分,Java程序可以使用JDBC的方式连接数据库,对数据库的调优分为3个部分:

  1. 在应用层对SQL语句进行优化:SQL语句优化有很多方式,不一一列举
  2. 对数据库进行优化:主要目的是建立一个具有良好表结构的数据库
  3. 对数据库软件进行优化:不同数据库都有不同的方式,不一一列举

操作系统调优

作为软件运行的基础平台,操作系统的性能对应用系统也有较大的影响。不同类型操作系统调优的手段和参数可能会有所不同。比如,主流UNIX系统中,共享内存,信号量,共享内存最大值(shmax),共享内存最小值(shmmin)等都是可以进行优化的系统资源。

基本调优优策略和手段

存在性能问题的系统,十之八九是由某一系统瓶颈导致的。只要找到该性能瓶颈,分析瓶颈的形成原因,对症下药,使用合理的方法解决系统瓶颈,就能从根本上提升性能。但同时值得注意的是,性能优化往往会涉及对原有实现进行较大的修改,因此很难保证这些修改不引入新的问题。所以,在性能优化前,需要 对性能优化的目标,方法进行统筹的安排

优化的一般步骤

对软件系统进行优化,首先需要有明确的性能目标,清楚地指出优化的对象和最终目的。其次,需要在目标平台上对软件进行测试,通过各种性能监控和统计工具,观测和确认当前系统是否已经达到相关目标,若已经达到,则没有必要再进行优化;若当前系统性能尚未达到优化目标,则需要查找当前的性能瓶颈

可能成为性能瓶颈的因素有很多,比如:磁盘I/O,网络I/O和CPU。当找到性能瓶颈后,首先需要定位相关代码,确认是否在软件实现上存在问题或者优化空间。若有,则进行代码优化;若已经没有优化空间,则需要考虑进行JVM层,数据库层或者操作系统的优化。甚至,可以考虑修改原有设计,或者提升硬件性能

当优化完成后,需要在目标平台进行确认测试。若达到则优化结束,反之则需要查找系统瓶颈,以此反复

系统优化注意事项

软件的性能优化虽然能提升软件的性能,但是优化过程往往伴随着一些风险和弊端。比如,为了优化某一段代码的实现,就需要重写原有的算法,而这就很可能引入新的bug。重新实现新的功能模块也同时意味着需要重新对其进行完整的功能性测试,使优化前所做的测试工作变得毫无意义。而且,优化后的代码与优化前的代码相比,可能会比较晦涩难懂,从一定程度上影响了系统的可维护性。因此,软件优化需要在软件功能、正确性和维护性间取得平衡,而不应该过分地追求软件性能

在进行优化前,必须要有明确的已知问题和性能目标,决不可为了“优化”而“优化”。在动手前,必须知道自己要干什么。任何优化都是为了解决具体的软件问题,如果软件已经可以正常工作,在性能问题没有暴露前,只是凭着主观臆断对某些模块进行性能改进,从软件规范化开发的角度上来说,是非常冒险的。因为修改后的新代码没有经过完整的测试,软件质量就没有保障。而且,优化后的性能提升幅度可能也不足以让开发者如此费尽心机。因此,在进行软件优化时,必须要进行慎重的评估

转载于:https://www.cnblogs.com/hzzjj/p/9807690.html

第一章 Java性能调优概述相关推荐

  1. Java 程序性能优化《第一章》Java性能调优概述 1.4小结

    Java 程序性能优化<第一章>1.4小结 通过本章的学习,读者应该了解性能的基本概念及其常用的参考指标.此外,本章还较为详细的介绍了与性能调优相关的两个重要理论--木桶原理以及Amdah ...

  2. 《Java性能调优实战》笔记(一)Java编程性能调优、多线程性能优化

    文章目录 一.Java性能调优概述 1.1 性能调优标准 1.2 制定性能调优策略 二.Java编程性能调优 2.1 字符串 2.2 正则表达式 2.3 ArrayList和LinkedList的选择 ...

  3. 面试怕被问“后端优化”问题?看看这套java性能调优手册吧!

    对于很多研发人员来说,Java 性能调优都是很头疼的问题. 比如,一个简单的系统就囊括了应用程序.数据库.容器.操作系统.网络等技术,线上一旦出现性能问题,就可能要你协调多方面组件去进行优化.另外,很 ...

  4. 拿着阿里这份Java性能调优手册,我把公司项目性能提升了300%

    程序的性能受代码质量的直接影响.那么该如何让代码在级别上提升系统性能呢? 其实性能提升永远没有捷径,需要 分析.优化.实验.监控 ,需要一点点积累和深入.随着你对项目和性能优化理解不断深入,会发现提升 ...

  5. 阿里教科书式Java性能调优笔记

    前言 Java由于其简单.面向对象.安全等特点,广泛的应用在各种应用领域,但在很多情况下,Java的运行性能仍有待提高. 优化Java的运行性能已成为当前业界迫切要解决的问题和当前的一个热点.比如你要 ...

  6. 强推!阿里教科书式Java性能调优笔记,竟让GitHub程序员集体叫好

    前言 Java由于其简单.面向对象.安全等特点,广泛的应用在各种应用领域,但在很多情况下,Java的运行性能仍有待提高. 优化Java的运行性能已成为当前业界迫切要解决的问题和当前的一个热点.比如你要 ...

  7. java 性能调优_Java性能调优调查结果(第一部分)

    java 性能调优 我们在2014年10月进行了Java性能调优调查.该调查的主要目的是收集对Java性能世界的见解,以改善Plumbr产品. 但是,我们也很高兴与您分享有趣的结果. 我们收集的数据为 ...

  8. Java性能调优调查结果(第一部分)

    我们在2014年10月进行了Java性能调优调查.该调查的主要目的是收集对Java性能世界的见解,以改进Plumbr产品. 但是,我们也很高兴与您分享有趣的结果. 我们收集的数据为进行冗长的分析提供了 ...

  9. java必读书籍_最佳5本Java性能调优书籍–精选,必读

    java必读书籍 为什么Java开发人员应该阅读有关性能调优的书? 当我很久以前第一次面对这个问题时,我以为以后会做,但是我很长一段时间都没有回过头来. 仅当我在用Java编写的任务关键型服务器端财务 ...

最新文章

  1. RansomCoin 二进制中提取加密货币地址
  2. Canvas 波形图
  3. 腾讯容器云平台GaiaStack亮相kubeCon
  4. 680. 验证回文字符串 Ⅱ golang
  5. 什么是面向对象_什么是面向对象?新手程序员必掌握的技能
  6. 工作流实战_25_flowable 流程中的自动跳过
  7. For input string:
  8. PHP时间日期增减操作示例【date strtotime实现加一天、加一月等操作】
  9. ClickHouse数据导入(Flink、Spark、Kafka、MySQL、Hive)
  10. python保存html图_如何保存“完整网页”不仅仅是使用Python的基本HTML
  11. 使用conda管理虚拟环境
  12. 视频直播方案(加强版
  13. 【杂记】01:王者荣耀,再见?
  14. 第3课:中移物联网蜂窝通信模组OpenCPU探秘
  15. 修复windows系统引导
  16. tensorboard画图
  17. android 适配7.0,Android7.0适配心得(一)_拍照兼容
  18. Java开源项目管理工具大全
  19. 人工智能专业就业方向有哪些?
  20. (61)Verilog生成vcd波形文件

热门文章

  1. 服务器维护首先查看指示灯,HP ILO2 使用详细教程[图文]
  2. 谜底是计算机的谜语英语,有关英语谜语大全及答案
  3. 自己写一个strcmp函数
  4. Mac系统升级后,无法安装Cornerstone解决办法
  5. java d打字游戏_练习--java实现的打字游戏
  6. 公司债务法人代表有义务还吗?
  7. 用Git在阿里云下克隆时出现“Please make sure you have the correct access rights and the repository exists”错误
  8. mysql的用户名迁移SCHEMA_数据库实时转移之Confluent环境搭建(二)
  9. 中国最美的一千个汉字 : 千字文5
  10. 计算机奥赛金牌排名,2019五大学科竞赛含金量排名