阅读更多

0顶
0踩

编程语言

原创新闻 Java性能调优的11个实用技巧

2017-11-10 09:38 by 副主编 jihong10102006 评论(1) 有21179人浏览
引用
原文链接:11 Simple Java Performance Tuning Tips(责编/魏伟)

大多数开发人员认为性能优化是个比较复杂的问题,需要大量的经验和知识。是的,这并不没有错。诚然,优化应用程序以获得最好的性能并不是一件容易的事情,但这并不意味着你在没有获得这些经验和知识之前就不能做任何事。下面有几个很容易遵循的建议和最佳实践能够帮你创建一个性能良好的应用程序。

这些建议中的大多数都是基于Java的,但是也不一定,也有一些是可以应用于所有的应用程序和编程语言的。在我们分享基于Java的性能调优技巧之前,让我们先讨论一下这些通用的性能调优技巧。

1.在必要之前,先不要优化

这可能是最最重要的性能调优技巧之一。你应该遵循常见的最佳实践,并尝试有效地实现你的用例。但这并不意味着在证明它是必要之前,替换任何标准库或构建复杂的优化。

在大多数情况下,过早的优化占用了大量的时间,使得代码难以读取和维护。更糟糕的是,这些优化通常不会带来任何好处,因为你花费了大量时间来优化应用程序的非关键部分。

那么,你如何证明你需要优化某些东西呢?

首先,你需要确定应用程序代码的速度,例如,为所有API调用指定一个最大响应时间,或者指定在特定时间范围内导入的记录数量。完成之后,你可以度量应用程序的哪些部分太慢而需要改进。当这样做之后,那么请继续看第二个调优技巧。

2.使用分析器来找到真正的瓶颈

在你遵循第一条建议,并确定你的应用程序的某些部分的确需要改进之后,问自己从哪里开始?

你可以用两种方法来解决这个问题:
  • 你可以看一下你的代码,从看起来可疑或者你觉得它可能会产生问题的部分开始。
  • 或者使用分析器,获取代码中每个部分的行为和性能的详细信息。
至于为什么应该总是遵循第二种方法。

答案应该很明显,基于分析器的方法能让你更好地理解代码的性能含义,并允许你关注最关键的部分。如果你曾经使用过分析器,你将会惊讶于代码的哪些部分造成了性能问题。然而,很多时候,你的第一次猜想会把你引向错误的方向。

3 .为整个应用程序创建性能测试套件

这是另一个帮助你避免许多意想不到问题的一般技巧,这些问题通常发生在性能改进部署到生产环境之后。你应该经常定义测试整个应用程序的性能测试套件,并在你完成性能改进之前和之后运行它。

这些额外的测试运行将帮助你识别更改的功能和性能方面的影响,并确保你不会发布一个弊大于利的更新。如果你的任务运行于应用程序的多个不同部分比如数据库或缓存,这一点尤其重要。

4.首先解决最大的瓶颈问题

在创建了测试套件并使用分析器对应用程序进行分析之后,你就有了一个需要提高性能的问题列表,这很好,但它仍然不能回答你应该从哪里开始的问题。你可以从那些可以快速搞定的开始,亦或者从最重要的问题开始。

当然前者很诱人,因为这很快就能出结果。有时,可能需要说服其他团队成员或你的管理层,性能分析是值得的。

但总的来说,我建议首先着手处理最重要的性能问题。这将为你提供最大的性能改进,而且你可能只需要修复这些问题中的几个就可以解决你的性能需求。

在了解通用性能调优技巧之后,让我们再来仔细看看一些特定于Java的调优技巧。

5.使用StringBuilder以编程方式连接字符串

在Java中有许多不同的连接字符串的选项。例如,可以使用一个简单的+或+ =、老的StringBuffer或StringBuilder

那么,你应该选择哪种方法呢?

答案取决于连接字符串的代码。如果你以编程方式向字符串中添加新内容,例如,在for循环中,你应该使用StringBuilder。它比StringBuffer更容易使用和提供更好的性能。但是请记住,StringBuilder与StringBuffer不同,它不是线程安全的,而且可能不适合所有用例。

你只需要实例化一个新的StringBuilder,并调用append方法在字符串中添加一个新的部分。当你添加了所有的部分后,可以调用toString()方法来检索连接字符串。

下面的代码片段展示了一个简单的示例。在每次迭代过程中,这个循环将i转换成一个字符串,并将其添加到StringBuilder sb的空间中,因此到最后,这段代码写入“this is test0123456789”到日志文件。
StringBuilder sb = new StringBuilder(“This is a test”);
for (int i=0; i<10; i++) {
    sb.append(i);
    sb.append(” “);
}
log.info(sb.toString());

正如在代码片段中看到的,你可以为构造函数方法提供字符串的第一个元素。这将创建一个新的StringBuilder,其中包含提供的字符串和16个额外字符的容量。当你向StringBuilder中添加更多字符时,JVM将动态地改变StringBuilder的大小。

如果你已经知道自己的字符串包含多少字符,那么你可以向不同的构造函数方法提供这个数字,以实例化一个具有被定义容量的StringBuilder。这进一步提高了它的效率,因为它不需要动态扩展它的容量。

6.在声明中使用+连接字符串

当你在Java中实现第一个应用程序时,可能有人告诉你不应该用+来连接字符串。如果在应用程序逻辑中连接字符串这是正确的。字符串是不可变的,每个字符串连接的结果存储在一个新的字符串对象中。这需要额外的内存,并降低应用程序的速度,特别是在循环中连接多个字符串时。

在这些情况下,你应该遵循tip 5并使用StringBuilder。

但如果你只是将一个字符串分解成多行来提高代码的可读性,那就不是这样了。
Query q = em.createQuery(“SELECT a.id, a.firstName, a.lastName ”
+ “FROM Author a ”
+ “WHERE a.id = :id”);

在这些情况下,你应该用一个简单的+来连接你的字符串。Java编译器将优化它并在编译时执行连接。因此,在运行时,代码只使用1个字符,不需要连接。

7.尽可能使用基本数据类型

另一种避免开销,提高应用程序性能的快速方法就是使用原始数据类型而不是它们的包装类。因此,最好是使用int而不是Integer,或者是double而不是Double。这将让JVM将值存储在堆栈中,以减少内存消耗,并更有效地处理它。

8.尽量避免BigInteger和BigDecimal

由于我们已经讨论了数据类型,我们再来看下BigIntegerBigDecimal。尤其是后者,由于其精度高而受欢迎。但这是有代价的。
BigInteger和BigDecimal比简单的long或double需要更多的内存,并且大大降低所有的计算速度。因此,如果你需要额外的精度,或者你的数字超过了一个long范围,最好三思而后行。这可能是你在提升性能问题中唯一需要更改的地方,特别是当你正在实现一个数学算法。

9.首先检查当前日志级别

这个建议是显而易见的,但不幸的是,你会发现许多代码忽略它。在创建调试消息之前,应该先检查当前日志级别。

这里有两个例子来说明你不应该这样做。
// don’t do this
log.debug(“User [” + userName + “] called method X with [” + i + “]”);
// or this
log.debug(String.format(“User [%s] called method X with [%d]”, userName, i));

在这两种情况下,你将执行所有需要的步骤来创建日志消息,而不知道日志框架是否使用日志消息。在创建调试消息之前,最好先检查当前日志级别。
// do this
if (log.isDebugEnabled()) {
    log.debug(“User [” + userName + “] called method X with [” + i + “]”);
}

10.使用Apache Commons StringUtils.Replace 代替String.replace

一般来说,String.replace 方法工作得很好,而且非常高效,特别是如果你使用的是Java 9。但是,如果应用程序需要大量的替换操作,并且你还没有更新到最新的Java版本,那么检查更快和更有效的替代方案仍然是有意义的。

一个候选就是 Apache Commons Lang’s StringUtils.replace 方法。正如Lukas Eder在他最近的一篇博客文章中所描述的那样,它大大超过了Java 8的String.replace 方法。

它只需要很小的改变。你只需要为Apache’s Commons Lang 项目增加一个Maven依赖项到你的应用pom.xml,并用StringUtils.replace方法替换所有String.replace方法的调用。
// replace this
test.replace(“test”, “simple test”);
// with this
StringUtils.replace(test, “test”, “simple test”);

11.缓存昂贵的资源,比如数据库连接

缓存是一种流行的解决方案来避免重复执行昂贵或频繁使用的代码片段。一般的想法很简单:重复使用这些资源比一次又一次地创建一个新的资源要便宜得多。

一个典型的例子就是在池中缓存数据库连接。创建新连接需要时间,如果重用现有连接,则可以避免。

还可以在Java语言本身中找到其他示例。例如,Integer类的valueOf方法缓存了- 128和127之间的值。你可能会说,创建一个新整数并不太贵,但它经常使用,缓存最常用的值提供了性能方面的好处。

但当你考虑缓存时,请记住,缓存实现也会产生开销。你需要花费额外的内存来存储可重用资源,因此可能需要管理你的缓存,以使资源能够访问或删除过时的资源。

因此,在你开始缓存任何资源之前,请确保是经常使用。

总结

正如你所看到的,提高应用程序的性能有时不需要做大量的工作。这篇文章中的大多数建议,其实只需要稍微的努力就可以将它们应用到代码中。

但通常最重要的建议是很编程语言无关的:
  • 在你知道有必要之前,不要优化
  • 使用分析器来找到真正的瓶颈
  • 首先解决最大的瓶颈问题
0
0
评论 共 1 条 请登录后发表评论
1 楼 lixuejian 2017-11-17 09:03

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 分享Java性能调优的11个实用技巧

    些建议中的大多数都是基于Java的,但是也不一定,也有一些是可以应用于所有的应用程序和编程语言的。在我们分享基于Java的性能调优技巧之前,让我们先讨论一下这些通用的性能调优技巧

  • java 调优_Java 性能调优的 11 个实用技巧

    作者丨Thorben Janssen责编丨魏伟大多数开发人员认为性能优化是个比较复杂的问题,需要大量的经验和知识。...下面有几个很容易遵循的建议和最佳实践能够帮你创建一个性能良好的应用程序。这些建议...

  • 关于Java性能调优的11个简单技巧

    点击上方关注 “终端研发部”设为“星标”,和你一起掌握更多数据库知识源/Java联盟相信...也不是,以下就整理了11个实用技能,小伙伴们快来get吧~在你知道必要之前不要优化这可能是最重要的性能调整技巧之一。...

  • Java性能调优的7个实用技巧分享

    Java 应用性能优化是一个老生常谈的话题,典型的性能问题如页面响应慢、接口超时,服务器负载高、并发数低,数据库频繁死锁等。尤其是在“糙快猛”的互联网开发模式大行其道的今天,随着系统访问量的日益增加和代码...

  • Java性能调优的9个实用技巧

    StingBuilder 应该是在我们的Java代码中默认使用的,应该避免使用 + 操作符。 一般来说,使用 StringBuilder 的效果要优于使用 + 操作符。如果可能的话请在需要跨多个方法传递引用的情况下选择 StringBuilder,...

  • jsp物流信息网建设(源代码+论文)(2024vl).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

  • 中小学教师教育教学情况调查表(学生家长用).docx

    中小学教师教育教学情况调查表(学生家长用)

  • 航空车辆检测8-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rar

    航空车辆检测8-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rarTepegozz-V2 2024-04-21 12:16 pm ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包含4794张图像。 Tepegozz以可可格式注释。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为640x640(拉伸) 应用以下扩展来创建每个源图像的3个版本: *水平翻转的50%概率 *垂直翻转的50%概率 *随机裁剪图像的0%至20% * -15和+15度之间的随机旋转 * 0到1.7像素之间的随机高斯模糊 *将盐和胡椒噪声应用于0.1%的像素 以下转换应用于每个图像的边界框: *以下90度旋转之一的同等概

  • LabVIEW实现NB-IoT通信【LabVIEW物联网实战】

    资源说明:https://blog.csdn.net/m0_38106923/article/details/144637354 一分价钱一分货,项目代码可顺利编译运行~

  • jsp网上购书系统设计(源代码+论文)(202490).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

  • jsp网络购物系统[适合毕业设计](202429).7z

    1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;

  • 【图像去雾】基于matlab暗通道先验和引导图像过滤单图像去雾【含Matlab源码 9914期】.zip

    Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

  • 深圳建设工程公司合同管理制度.docx

    深圳建设工程公司合同管理制度

  • 【java毕业设计】智慧社区综合平台(源代码+论文+PPT模板).zip

    有java环境就可以运行起来 ,zip里包含源码+论文+PPT, 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上

  • 基于yolov5实现目标检测+双目摄像头实现距离测量源码

    基于yolov5实现目标检测+双目摄像头实现距离测量源码+文档(毕业设计) 基于yolov5实现目标检测+双目摄像头实现距离测量源码+文档(毕业设计) 基于yolov5实现目标检测+双目摄像头实现距离测量源码+文档(毕业设计) 基于yolov5实现目标检测+双目摄像头实现距离测量源码+文档(毕业设计) 基于yolov5实现目标检测+双目摄像头实现距离测量源码+文档(毕业设计) 基于yolov5实现目标检测+双目摄像头实现距离测量源码+文档(毕业设计)基于yolov5实现目标检测+双目摄像头实现距离测量源码+文档(毕业设计)基于yolov5实现目标检测+双目摄像头实现距离测量源码+文档(毕业设计)基于yolov5实现目标检测+双目摄像头实现距离测量源码+文档(毕业设计)基于yolov5实现目标检测+双目摄像头实现距离测量源码+文档(毕业设计)基于yolov5实现目标检测+双目摄像头实现距离测量源码+文档(毕业设计)基于yolov5实现目标检测+双目摄像头实现距离测量源码+文档(毕业设计)基于yolov5实现目标检测+双目摄像头实现距离测量源码+文档(毕业设计)基于yolov5实现目标检测

  • 基于Java技术的下拉导航菜单设计源码

    该项目是一款采用Java技术实现的下拉式导航菜单设计源码,包含53个文件,涉及18个Java源文件、11个XML配置文件、9个PNG图片文件、6个JSON数据文件、4个Gradle构建脚本、2个Markdown文档以及1个开源许可证文件。

  • LitJsonDLL类库

    LitJsonDLL类库

  • 免费下载:普通高中教科书 信息技术 必修2 信息系统与社会 (上海市中小学(幼儿园)_1riYg.zip

    免费下载:普通高中教科书 信息技术 必修2 信息系统与社会 (上海市中小学(幼儿园)_1riYg.zip

  • 【java毕业设计】智慧社区金融服务网络.zip

    有java环境就可以运行起来 ,zip里包含源码+论文+PPT, 系统设计与功能: 文档详细描述了系统的后台管理功能,包括系统管理模块、新闻资讯管理模块、公告管理模块、社区影院管理模块、会员上传下载管理模块以及留言管理模块。 系统管理模块:允许管理员重新设置密码,记录登录日志,确保系统安全。 新闻资讯管理模块:实现新闻资讯的添加、删除、修改,确保主页新闻部分始终显示最新的文章。 公告管理模块:类似于新闻资讯管理,但专注于主页公告的后台管理。 社区影院管理模块:管理所有视频的添加、删除、修改,包括影片名、导演、主演、片长等信息。 会员上传下载管理模块:审核与删除会员上传的文件。 留言管理模块:回复与删除所有留言,确保系统内的留言得到及时处理。 环境说明: 开发语言:Java 框架:ssm,mybatis JDK版本:JDK1.8 数据库:mysql 5.7及以上 数据库工具:Navicat11及以上 开发软件:eclipse/idea Maven包:Maven3.3及以上

Global site tag (gtag.js) - Google Analytics