欢迎访问牛耳教育官网 专注实战IT培训技术20年!
400-0731-162
当前位置:IT培训机构 > Java培训 > 关于Java性能调优的11个简单技巧

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

时间: 2019-01-18 | 作者: java小明 | 分类:Java培训 | 关键字:Java性能调优 | 阅读量:

导读:相信大多数的小伙伴都会觉着性能优化是一件很复杂的事,那么是不是呢?优化应用程序获得最佳性能并不是一件容易的事。它需要一定的经验和知识。 那么,我们现阶段还不具备这样的经验...

  相信大多数的小伙伴都会觉着性能优化是一件很复杂的事,那么是不是呢?优化应用程序获得最佳性能并不是一件容易的事。它需要一定的经验和知识。
  
  那么,我们现阶段还不具备这样的经验和知识,是不是就做不到了呢?也不是,以下就整理了11个实用技能,小伙伴们快来get吧~
  
  在你知道必要之前不要优化
  
  这可能是最重要的性能调整技巧之一。你应该遵循常见的最佳实践做法并尝试高效地实现用例。但是,这并不意味着在你证明必要之前,你应该更换任何标准库或构建复杂的优化。
  
  在大多数情况下,过早优化不但会占用大量时间,而且会使代码变得难以阅读和维护。更糟糕的是,这些优化通常不会带来任何好处,因为你花费大量时间来优化的是应用程序的非关键部分。
  
  那么,你如何证明你需要优化一些东西呢?
  
  首先,你需要定义应用程序代码的速度得多快,例如,为所有API调用指定最大响应时间,或者指定在特定时间范围内要导入的记录数量。在完成这些之后,你就可以测量应用程序的哪些部分太慢需要改进。
  
  使用分析器查找真正的瓶颈
  
  在你遵循第一个建议并确定了应用程序的某些部分需要改进后,那么从哪里开始呢?
关于Java性能调优的11个简单技巧
  
  你可以用两种方法来解决问题:
  
  查看你的代码,并从看起来可疑或者你觉得可能会产生问题的部分开始。
  
  或者使用分析器并获取有关代码每个部分的行为和性能的详细信息。
  
  希望不需要我解释为什么应该始终遵循第二种方法的原因。
  
  很明显,基于分析器的方法可以让你更好地理解代码的性能影响,并使你能够专注于最关键的部分。
  
  如果你曾使用过分析器,那么你一定记得曾经你是多么惊讶于一下就找到了代码的哪些部分产生了性能问题。老实说,我第一次的猜测不止一次地导致我走错了方向。
  
  为整个应用程序创建性能测试套件
  
  这是另一个通用技巧,可以帮助你避免在将性能改进部署到生产后经常会发生的许多意外问题。
  
  你应该总是定义一个测试整个应用程序的性能测试套件,并在性能改进之前和之后运行它。
  
  这些额外的测试运行将帮助你识别更改的功能和性能副作用,并确保不会导致弊大于利的更新。
  
  如果你工作于被应用程序若干不同部分使用的组件,如数据库或缓存,那么这一点就尤其重要。
  
  首先处理最大的瓶颈
  
  在创建测试套件并使用分析器分析应用程序之后,你可以列出一系列需要解决以提高性能的问题。这很好,但它仍然不能回答你应该从哪里开始的问题。你可以专注于速效方案,或从最重要的问题开始。
  
  速效方案一开始可能会很有吸引力,因为你可以很快显示第一个成果。但有时,可能需要你说服其他团队成员或管理层认为性能分析是值得的——因为暂时看不到效果。
  
  但总的来说,我建议首先处理最重要的性能问题。这将为你提供最大的性能改进,而且可能再也不需要去解决其中一些为了满足性能需求的问题。
  
  常见的性能调整技巧到此结束。下面让我们仔细看看一些特定于Java的技巧。
  
  使用StringBuilder以编程方式连接String
  
  有很多不同的选项来连接Java中的String。例如,你可以使用简单的+或+ =,以及StringBuffer或StringBuilder。
  
  那么,你应该选择哪种方法?
  
  答案取决于连接String的代码。如果你是以编程方式添加新内容到String中,例如在for循环中,那么你应该使用StringBuilder。
  
  它很容易使用,并提供比StringBuffer更好的性能。但请记住,与StringBuffer相比,StringBuilder不是线程安全的,可能不适合所有用例。
  
  你只需要实例化一个新的StringBuilder并调用append方法来向String中添加一个新的部分。在你添加了所有的部分之后,你就可以调用toString()方法来检索连接的String。
  
  下面的代码片段显示了一个简单的例子。在每次迭代期间,这个循环将i转换为一个String,并将它与一个空格一起添加到StringBuilder sb中。
  
  所以,最后,这段代码将在日志文件中写入“This is a test0 1 2 3 4 5 6 7 8 9”。
  
  StringBuilder sb = new StringBuilder(“This is a test”);
  
  for (int i=0; i<10; i++) {
  
  sb.append(i);
  
  sb.append(” “);
  
  }
  
  log.info(sb.toString());
  
  正如在代码片段中看到的那样,你可以将String的第一个元素提供给构造方法。
  
  这将创建一个新的StringBuilder,新的StringBuilder包含提供的String和16个额外字符的容量。当你向StringBuilder添加更多字符时,JVM将动态增加StringBuilder的大小。
  
  如果你已经知道你的String将包含多少个字符,则可以将该数字提供给不同的构造方法以实例化具有定义容量的StringBuilder。这进一步提高了效率,因为它不需要动态扩展其容量。
  
  使用+连接一个语句中的String
  
  当你用Java实现你的第一个应用程序时,可能有人告诉过你不应该用+来连接String。如果你是在应用程序逻辑中连接字符串,这是正确的。
  
  字符串是不可变的,每个字符串的连接结果都存储在一个新的String对象中。这需要额外的内存,会减慢你的应用程序,特别是如果你在一个循环内连接多个字符串的话。
  
  在这些情况下,你应该遵循技巧5并使用StringBuilder。
  
  但是,如果你只是将字符串分成多行来改善代码的可读性,那情况就不一样了。
  
  Query q = em.createQuery(“SELECT a.id, a.firstName, a.lastName ”
  
  + “FROM Author a ”
  
  + “WHERE a.id = :id”);
  
  在这些情况下,你应该用一个简单的+来连接你的字符串。Java编译器会对此优化并在编译时执行连接。所以,在运行时,你的代码将只使用1个String,不需要连接。
  
  尽可能使用基元
  
  避免任何开销并提高应用程序性能的另一个简便而快速的方法是使用基本类型而不是其包装类。
  
  所以,最好使用int来代替Integer,使用double来代替Double。这允许JVM将值存储在堆栈而不是堆中以减少内存消耗,并作出更有效的处理。
  
  试着避免BigInteger和BigDecimal
  
  既然我们在讨论数据类型,那么我们也快速浏览一下BigInteger和BigDecimal吧。尤其是后者因其精确性而受到大家的欢迎。但是这是有代价的。
  
  BigInteger和BigDecimal比简单的long或double需要更多的内存,并且会显著减慢所有计算。
  
  所以,你如果需要额外的精度,或者数字将超过long的范围,那么最好三思而后行。这可能是你需要更改以解决性能问题的唯一方法,特别是在实现数学算法的时候。
  
  首先检查当前日志级别
  
  这个建议应该是显而易见的,但不幸的是,很多程序员在写代码的时候都会大多会忽略它。
  
  在你创建调试消息之前,始终应该首先检查当前日志级别。否则,你可能会创建一个之后会被忽略的日志消息字符串。
  
  这里有两个反面例子。
  
  // 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 + “]”);
  
  }
  
  使用Apache Commons StringUtils.Replace而不是String.replace
  
  一般来说,String.replace方法工作正常,效率很高,尤其是在使用Java 9的情况下。但是,如果你的应用程序需要大量的替换操作,并且没有更新到最新的Java版本,那么我们依然有必要查找更快和更有效的替代品。
  
  有一个备选答案是Apache Commons Lang的StringUtils.replace方法。
  
  正如Lukas Eder在他最近的一篇博客文章中所描述的,StringUtils.replace方法远胜Java 8的String.replace方法。
  
  而且它只需要很小的改动。即添加Apache Commons Lang项目的Maven依赖项到应用程序pom.xml中,并将String.replace方法的所有调用替换为StringUtils.replace方法。
  
  // replace this
  
  test.replace(“test”, “simple test”);
  
  // with this
  
  StringUtils.replace(test, “test”, “simple test”);
  
  缓存昂贵的资源,如数据库连接
  
  缓存是避免重复执行昂贵或常用代码片段的流行解决方案。总的思路很简单:重复使用这些资源比反复创建新的资源要便宜。
  
  一个典型的例子是缓存池中的数据库连接。新连接的创建需要时间,如果你重用现有连接,则可以避免这种情况。
  
  你还可以在java语言本身找到其他例子。例如,Integer类的valueOf方法缓存了-128到127之间的值。
  
  你可能会说创建一个新的Integer并不是太昂贵,但是由于它经常被使用,以至于缓存最常用的值也可以提供性能优势。
  
  但是,当你考虑缓存时,请记住缓存实现也会产生开销。你需要花费额外的内存来存储可重用资源,因此你可能需要管理缓存以使资源可访问,以及删除过时的资源。
  
  所以,在开始缓存任何资源之前,请确保实施缓存是值得的,也就是说必须足够多地使用它们。
  
  总结
  
  正如你所看到的,有时不需要太多工作就可以提高应用程序的性能。本文中的大部分建议只需要你稍作努力就可以将它们应用于你的代码。
  
  但是,最重要的还是那些与是什么编程语言无关的技巧:
  
  在你知道必要之前不要优化
  
  使用分析器查找真正的瓶颈
  
  首先处理最大的瓶颈
推荐阅读:
免责声明:本文内容来源于公开网络,若涉及侵权联系尽快删除!,【本文标题和网址】关于Java性能调优的11个简单技巧:http://www.csnewer.com/java_news/31.html
申请免费试学
快捷咨询
资深IT讲师一对一为您解答IT问题
电话
咨询服务电话
400-0731-162
微信
IT培训_java培训机构_专注于实战IT培训技术20年-牛耳教育官网
关注了解更多IT知识
QQ
热门课程
java软件开发课程 Java是一种可以撰写跨平台应用程不齐人60%Java工程师缺口序的面向对象的程序设计语言。Java技术具有卓越的通用性、高效性、...
嵌入式应用开发课程 嵌入式开发就是指在嵌入式操作系统下进行开发,包括在系统化设计指导下的硬件和软件以及综合研发。除暂且分离硬件的...
软件测试课程 软件测试具有人才缺口大、发展方向广、专业无限制、适合零基础、技术上手快、职业生涯稳等优势。 人才缺口大 国内测试...
Web前端开发课程 web前端开发是创建Web页面或app等前端界面呈现给用户的过程,通过HTML,CSS及JavaScript以及衍生出来的各种技术、框架、解决方...
java+大数据课程 什么是Java大数据? Java,是一门面向对象编程语言,具有功能强大和简单易用的特征。作为**受欢迎的计算机语言,发展至今...
python人工智能课程 Python是一门神奇的编程语言,它具有简单易学、就业面广、就业薪资高、竞争压力小、开发效率高、行业风口等6个优势,下...
热门资讯
本文:(零基础学java)零基础也能学Java,5大Java学习方法!,最近有很多同学来问小编,关于学习java的方法,下面小编根据...
大家的生活已经离不开嵌入式就连常用的共享单车都离不开嵌入式。所以越来越多的人看中了嵌入式的就业前景,转行来做嵌...
Web前端培训机构的好坏直接决定了你学习后的就业薪资,市面上web前端培训机构那么多,应该如何选择靠谱的web前端培训机构...
打算参加嵌入式培训的同学对于嵌入式培训课程的内容都特别的关心,只有在了解了课程内容之后才能更好的知道这个嵌入式...
当谈到Python时,一般指的是CPython。但Python实际上是一门语言规范,只是定义了Python这门语言应该具备哪些语言要素,应当能...
2020年学习嵌入式晚不晚?1、学技术不像学艺术,只要坚持,任何时候学都不晚。很多人对于学习嵌入式应用开发都会有所顾...
本文(零基础学python)0基础学习Python容易犯哪些错误呢?主要介绍1. 忘记写冒号 在if、elif、else、for、while、class、def 语句后...
参加IT培训,学哪个技术前景更好呢?java开发、大数据、人工智能、机器学习都是很好的方向。至于选择什么专业,这需要根...
web前端开发火爆了,岗位也紧俏了,薪资也提升了,随着2020年的到来,很多想要入行web前端的学子纷纷加入到web师培训学习...
it培训学校有用吗?其实判断IT培训学校有没有用,看培训的课程是否能满足自己的需求就可以了,如果培训的课程自己都了...