性能文件疏导优化-概述-PGO-在Java运行程序中监禁峰值性能 (性能型文件存储采用)
译者|李睿
审校|重楼
在开发畛域,优化运行程序的性能是开发人员的继续谋求。性能文件疏导优化(Profile-GuidedOptimization,PGO)是一种性能弱小的技术,能够清楚地提高Java运行程序的效率。经过应用运转时Profiling数据,PGO使开发人员能够对代码启动微调,并依据运行程序的实践经常使用形式启动优化。本文将深化钻研Java场景中PGO的复杂性,并提供实践示例来说明其有效性。
了解PGO
性能文件疏导优化(PGO)是一种优化技术,它经常使用运转时Profiling数据在编译环节中做出理智的决策。它协助编译器优化频繁口头的代码门路,同时防止对较少经常使用的门路启动不用要的优化。为了了解PGO的实质,以下深化了解它的关键组成局部:
![Java](https://tyye.cn/zb_users/theme/tpure/style/images/lazyload.png)
(1)Profiling
PGO的外围是Profiling,它包括搜集程序口头的运转时数据。Profiling使代码能够跟踪诸如方法调用频率、分支预测结果和内存访问形式等目的。搜集到的数据提供了对运行程序实践运转时行为的深化了解。
(2)训练运转
为了生成性能文件,运行程序在各种实践场景或训练运转下口头。这些训练运转模拟典型的经常使用形式,使探查器能够搜集无关程序行为的数据。
(3)性能文件数据
在训练运转时期搜集的数据存储在性能文件数据库中。这些消息封装了程序的口头特色,提供了哪些代码门路经常被口头,哪些代码很少被访问的见地。
(4)编译
在编译时期,Java虚构机(JVM)或即时编译器(JIT)经常使用性能文件数据来指点其优化决策。它可以更踊跃地优化频繁遍历的代码门路,从而或许缩短口头时期或缩小内存经常使用。
Java中的PGO示例
为了说明Java中性能文件疏导优化的实践好处,以下将探求一系列事实环球的例子。
(1)方法内联
方法内联是Java中经常出现的一种优化技术,PGO可以使其愈加有效。思考以下的Java代码:
JavapublicclassCalculator{publicstaticintadd(inta,intb){returna+b;}publicstaticvoidmn(String[]args){intresult=add(5,7);System.out.println("Result:"+result);}}
假设没有PGO,JVM或许会为add(5,7)生成一个独自的方法调用。但是,当PGO启用并且剖析数据标明add方法经常被调用时,JVM可以选择内联这一方法,从而优化代码:
JavapublicclassCalculator{publicstaticvoidmain(String[]args){intresult=5+7;System.out.println("Result:"+result);}}
内联方法消弭了方法调用的开支,从而提高了性能。
(2)循环开展
循环开展是PGO是成功智能运行的另一个优化。思考一个计算数组中元素的总和的Java程序:
JavapublicclassArraySum{publicstaticintsumArray(int[]arr){intsum=0;for(inti=0;i<arr.length;i++){sum+=arr[i];}returnsum;}publicstaticvoidmain(String[]args){int[]array=newint[100000];//Initializeandfillthearrayfor(inti=0;i<100000;i++){array[i]=i;}intresult=sumArray(array);System.out.println("Sum:"+result);}}
假设没有PGO,JVM将以一种间接的方式口头循环。但是,经常使用PGO,JVM可以检测到循环频繁口头,并选用开展它以提高性能:
JavapublicclassArraySum{publicstaticintsumArray(int[]arr){intsum=0;intlength=arr.length;inti=0;for(;i<length-3;i+=4){sum+=arr[i]+arr[i+1]+arr[i+2]+arr[i+3];}for(;i<length;i++){sum+=arr[i];}returnsum;}publicstaticvoidmain(String[]args){int[]array=newint[100000];//Initializeandfillthearrayfor(inti=0;i<100000;i++){array[i]=i;}intresult=sumArray(array);System.out.println("Sum:"+result);}}
在这个例子中,PGO的评测数据曾经通知JVM,循环开展是一个值得优化的环节,或许会带来清楚的性能优化。
(3)内存访问形式优化
优化内存访问形式关于提高数据密集型Java运行程序的性能至关关键。思考以下处置大型数组的代码片段:
JavapublicclassArraySum{publicstaticintsumEvenIndices(int[]arr){intsum=0;for(inti=0;i<arr.length;i+=2){sum+=arr[i];}returnsum;}publicstaticvoidmain(String[]args){int[]array=newint[1000000];//Initializeandfillthearrayfor(inti=0;i<1000000;i++){array[i]=i;}intresult=sumEvenIndices(array);System.out.println("Sumofevenindices:"+result);}}
假设没有PGO,JVM或许无法有效地优化内存访问形式。但是,经过剖析数据,JVM可以识别跨步形式并启动相应的优化:
JavapublicclassArraySum{publicstaticintsumEvenIndices(int[]arr){intsum=0;intlength=arr.length;for(inti=0;i<length;i+=2){sum+=arr[i];}returnsum;}publicstaticvoidmain(String[]args){int[]array=newint[1000000];//Initializeandfillthearrayfor(inti=0;i<1000000;i++){array[i]=i;}intresult=sumEvenIndices(array);System.out.println("Sumofevenindices:"+result);}}
PGO可以经过将内存访问形式与配件性能相联合来清楚提高缓存性能。
在Java中成功PGO
在Java中成功PGO触及一系列步骤,包括搜集剖析数据、剖析数据并运行优化来提高运行程序的性能。以下将更详细地讨论这些步骤。
(1)罕用的Profiling工具
要启动PGO环节,须要对Java运行程序启动剖析。Java有几种可用的Profiling工具,每种工具都有自己的个性和性能。一些罕用的工具包括:
开发人员可以选用最适宜自己需求的剖析工具,并将其性能为搜集与运行程序性能瓶颈关系的特定剖析数据。剖析可以包括方法调用频率、内存调配形式和线程行为。
(2)训练运转
有了选用的剖析工具,将须要在各种代表性场景下运转Java运行程序,这些场景通常被称为训练运转。这些训练运转应该尽或许地模拟实在的经常使用形式。在这些运转环节中,剖析工具搜集无关运行程序口头行为的数据。
可以思考以下场景:
经过启动片面的训练运转,可以捕捉运行程序或许显示宽泛的运转时行为。
(3)性能文件数据
Profiling工具从训练运转中搜集数据,并将其存储在性能文件数据库或日志文件中。而性能文件数据是了解运行程序在实践场景中的口头状况的贵重资源。它蕴含关于哪些方法被频繁调用、哪些代码门路被最频繁口头以及哪里存在潜在瓶颈的消息。
性能文件数据或许包括如下目的:
性能文件数据是理智的优化决策的基础。
(4)编译
Java虚构机(JVM)或即时编译器(JIT)担任将Java字节码转换为原生机器码。在编译时期,JVM或JIT编译器可以经常使用性能文件数据来指点其优化决策。
在编译时期启用PGO的详细步骤或许会依据经常使用的JVM成功而有所不同:
须要留意的是,一些JVM(例如HotSpot)或许会在惯例口头时期智能搜集剖析数据,而不须要启用PGO。
(5)剖析与调优
一旦搜集了剖析数据并在编译时期启用了PGO,下一步就是剖析数据并运行优化。以下是剖析和调优的一些留意事项:
(6)活期从新剖析和优化
性能优化是一个继续的环节。随着运行程序的开展和经常使用形式的变动,活期从新剖析和优化关于坚持峰值性能至关关键。在运行程序生命周期的不同阶段继续搜集性能文件数据,并相应地调整优化。
论断
性能文件疏导优化(PGO)是Java开发人员工具包中的一个弱小工具,提供了提高运行程序性能的方法。经过应用运转时Profiling数据为优化决策提供消息,PGO使开发人员能够依据事实环球中遇到的特定经常使用形式定制他们的代码增强性能。
无论是触及方法内联、循环优化还是内存访问形式优化,PGO都是清楚提高Java运行程序效率和速度的一种催化剂,使它们愈加浪费资源。当开发人员踏上优化Java运行程序的旅程时,可以将PGO视为监禁其所有后劲的弱小盟友,确保它们不时提供顶级性能。
原文题目: UnleashPeakPerformanceinJavaApplications:OverviewofProfile-GuidedOptimization(PGO) ,作者:AndreiTuchin
java性能优化,程序员的必修课!
Java8个优化建议必须知道
1.做必要的优化
一定要记住一个最重要的优化原则,只有发现必须做的优化,否则不要做任何标准库的替换或者进行复杂的逻辑优化。
在大多数情况下,过早的优化会占用大量时间,并使代码难以阅读和维护。更糟的是,这些优化通常不会带来任何好处,因为将花费大量时间来优化应用程序的非关键部分。
2。查找真正的瓶颈
在遵循了第一个建议并确定了需要改进的部分以后,从哪里开始呢?
可以通过如下两种方法解决这个问题:
从可疑或者可能造成问题的地方开始。·或者通过分析器找到出现瓶颈的地方。通过分析器找到问题的办法可以让你更好的理解代码的性能,同时可以专注于最关键的部分,当然如果对干性能的分析你从未试过使用分析器,那么仅仅靠猜测的话估计只会凭借自己的直觉南辕北辙。
3.性能测试
这个一个非常重要的方式,提前写好程序的性能测试,这样就可以在你性能优化前后运行性能测试这样就可以实际的评估出部署程序以后实际解决性能问题的情况。同时可以避免一些因为性能优化导致的程序问题,比如你想针对数据库做缓存,那么这点就显得尤为重要了。
4.优先处理最大的瓶颈
在创建性能测试程序和使用 Profiler 分析应用程序以后,你会发现有一堆问题要去修复,但是问题又来了,还是不知道从何入手。
从一个可以最快解决问题改善性能的地方开始,这也是可以让你说服团队进行性能评估的必要性最好的依据了。但是相反,我建议从最重要的性能问题开始,这也是可以最大限度的改进性能。到这里通用的性能优化思路差不多了,我们了解一些 Java语言特定的优化方案。
6.在一个语句中拼接字符串使用 +
等下这个问题不是和 5冲突了吗?其实不是的。因为 String 的不可变性,如果在 for 循环中拼接String 每次都会创建一个新对象,但是一个语句中的 + 则不然,JVM 会在编译的时候针对一个字符串的 + 拼接做性能优化,最终使用一个 String对象,如下面的例子。
7.尽可能使用基本类型而不是包装类型
一个很常见并且很普遍的做法就是使用基本类型而不是包装类型,比如使用 int 替代 integer,使用double 替代 Double,这样可以使 JVM 把变量存储在 Stack 里面而不是 Heap 里面来减少整体的内存消耗。
8.尽量避免使用 Biginteger 和BigDecimal
上面我们已经在讨论数据类型,那我们继续看一下Biglnteger和BigDecimal,尤其是BigDecimal在精度上面给我们带来的利好足以让我们爱不释手,然而代价却是昂贵的。
与简单的long 或 double 相比, BigInteger 和BigDecimal需要更多的内存,从而大大降低了所有计算的速度。所以需要再三考虑是否存储值超过了long 类型的最大范围或者是精度无法控制了,如果不是优先考虑基本类型。
Java性能调优的使用技巧有哪些?
对于很多学习开发的人员来说,进行性能优化是一个非常复杂的问题,并且还需要大量的经验和知识积累。想要优化达到一定的效果是一件非常不容易的事情,很多人认为需要在经验非常丰富的情况下才能使用,其实在没有获得丰富经验和知识之前也是可能进行性能优化的,沙河电脑培训认为只要掌握一定的方法和技巧就能创建出性能良好的程序。
在进行性能调优的过程中,主要是基于Java语言,但是也有一些是可以使用在应用程序和编程语言中。那么在使用之前,沙河IT培训为大家一起讨论通用的性能调优技巧。
1、先不要急着优化
在必要之前,一定不要急着进行优化,这是一种非常重要的性能调优方法。在进行调优过程中,我们应该遵守最佳的实践方法,这样才能得到有效的实现。但是在使用过程中并不意味着需要证明必要性,最好的方法是使用标准库或是构建复杂进行优化。
在很多情况下,如果过早的进行优化会占用很大一部分的时间,还会出现代码不好读取和维护的情况。如果更严重,这样的优化是不会带来任何好处的,很多时候你花费大量时间进行优化的程序并非是最关键的地方。
2、使用分析器找到瓶颈
在确定应用程序的某些部分需要优化的时候,应从哪里进行入手呢?解决这种情况主要有两种方法,沙河IT培训认为首先就是了解代码,找出看上去存在问题和可能产生疑惑的地方开始优化。其次是可以使用分析器进行优化,分析器能够获取代码中每个部分的性能详细信息。
3、为应用程序创建测试套件
这个一种能够帮助你避免很多问题的方法,很多问题主要是发生在性能部署在生产环境之后。在使用过程中,你可以定义测试整个应用程序的套件,这样就能完成性能改造和运行。在测试运行的过程中,能够帮助你更改功能和性能的影响,这样才能让利大于弊。如果在使用过程中,你的任务运行于多个应用程序的多个部分,例如数据库、缓存等,这是非常重要的。
进行Java性能调优的技巧有很多种,在进行性能调优的过程中可以选择适合自己的方法,在提高应用程序的性能中,不需要做大量的工作。沙河电脑培训认为最好的方法就是进行稍微努力,这样就能很好的应用到代码中。
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。