看懂程序性能——性能的表现和各种指标

时间:2024-02-18 15:10:29

本篇文章是我阅读葛一鸣的《java程序性能调优》第一章总结


 

一、评价性能的主要指标

  对于客户端程序而言,拙劣的性能会严重影响用户体验。以web服务器为例,服务器的响应时间吞吐量是两个重要的参数性能。当服务器承受巨大的访问压力的时候,可能会出现响应时间变长,吞吐量下降,甚至是抛出内存溢出异常而崩溃。

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

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

     为了能够科学的进行性能分析,对性能指标进行定量评测是非常重要的。主要的定量评测的性能指标有:

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

二、性能瓶颈

  木桶原理大家都很清楚了,即决定一个木桶能装多少水,不在于桶壁上的最高的木块,而在于 桶壁上最短的那一块。同理运用在系统性能优化上,如果一个系统用于足够的CPU资源和内存资源,但是磁盘I/O性能底下,那么系统的性能取决于当前最慢的磁盘I/O速度,而不是内存和CPU。如果要提升系统性能,我们只能提升磁盘I/O的性能,优化CPU和内存是毫无必要的,因此磁盘I/O是系统的性能瓶颈。

最有可能成为系统瓶颈的计算资源如下:

  • 磁盘I/O  磁盘I/O的读写的速度要比内存慢很多
  • 网络操作 与磁盘I/O类似,由于网络环境的不稳定,可能网络操作会更慢
  • CPU 对计算资源要求较高的应用,由于长时间,不间断的占用占用CPU资源,那么对CPU的争夺将导致性能问题。
  • 异常 java的异常捕获和处理是十分消耗资源的。如果程序高频率的进行异常处理,整体性能会有明显下降
  • 数据库  等待数据库完成操作或者返回请求的结果集,缓慢的同步会成为系统瓶颈
  • 锁竞争  对于高并发的程序来说,如果存在激烈的锁竞争,会增加线程上下文切换的开销,白白占用包括的CPU资源
  • 内存   内存大小不足

三 Amdahl定律(阿姆达尔定律)

  阿姆达尔定律 定义了串行系统并行化后加速比的计算公式和理论上限

  加速比=优化前的系统耗时/优化后的系统耗时

  加速比越高,表明优化结果越明显

  阿姆达尔定律还定义了加速比与系统并行度和CPU数量的关系

  

  speed为加速比 , F为系统中串行化程序的比重,N为CPU的数量

  如果CPU的数量为无限大,则加速比=1/F,即加速比与系统的串行化律成反比,如果系统中必须有50%的代码串行,则加速比是2

  下面举个例子

  假设有个系统分为以下步骤执行,每个步骤耗时100个时间单位

  该系统为串行运行,将耗时500个时间单位

  若将步骤二和五并行化,则步骤二和五耗时将是50个时间单位。系统的整体耗时为400个时间单位

  加速比为=500/400=1.25

  5个步骤,3个串行,则系统串行比率为F=3/5=0.6,将加速比和F带入上面的公式,可以得出N=2,即处理器的个数为2

 

  若在极端的情况下,系统的串行率依然为50%,但是并行处理器为无数个,则步骤2和5的处理时间趋于0,系统的消耗时间为300个时间单位

  加速比=500/300=1.67

  即仅提高处理器的数量不一定起有效的作用,需要提高系统中并行化模块的比重,并在此基础上合理增加并行处理器数量,才能已最小的投入,获得最大的加速比