你的Java性能调优有救了!分享7个简单实用的Java性能调优技巧
一、以编程方式连接字符串
在Java中有很多不同的连接字符串的选项。比如,可以使用简单的+或+=、良好的旧StringBuffer或StringBuilder。
那么,应该选择哪种方法?
答案取决于连接字符串的代码。如果以编程方式向字符串添加新内容,例如在for循环中,则应使用StringBuilder。它相对而言易于使用,并拥有比StringBuffer更好的性能。但注意了,与StringBuffer相比,StringBuilder不是线程安全的,可能不适合所有用例。
只需要实例化一个新的StringBuilder并调用append方法向字符串中添加一个新的部分,添加完成后,可以调用toString()方法来检索连接的字符串。
下面举一个简略的例子。在每次迭代期间,这个循环将i转换为一个String,并将它与一个空格一同增加到StringBuilder sb中。最终,这段代码将在日志文件中写入“This is a test0 1 2 3 4 5 6 7 8 9”。
StringBuilder sb = newStringBuilder(“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的巨细。
如果你已经知道字符串将包含多少个字符,则可以将该数字提供给不同的构造函数方法,以实例化具有定义容量的StringBuilder。这将进一步提高其效率,因为它不需要动态扩展其容量。
二、使用+在一条语句中连接字符串
当你用Java完成你的第一个运用程序时,可能有人告诉你不该用+来衔接String。但如果你是在运用程序逻辑中衔接字符串,这就没啥问题了。
字符串是不可变的,每个字符串的衔接成果都存储在一个新的String目标中。这需求额定的内存,会减慢你的运用程序,特别是如果你在一个循环内衔接多个字符串的话。
在这些状况下,你应该遵从上个技巧并运用StringBuilder。但如果你只是将一个字符串拆分为多行以提高代码的可读性,那状况就不一样了。
Query q = em.createQuery(“SELECTa.id, a.firstName, a.lastName ”
+ “FROMAuthor a ”
+ “WHEREa.id = :id”);
在这些情况下,你应该使用简单的+连接字符串。Java编译器将对此进行优化,并在编译时执行连接。因此,在运行时,你的代码将只使用1个字符串,不需要串联。
三、尽可能使用Primitives
另一种避免任何开销并提高应用程序性能的快速简便方法是使用Primitives而不是它们的包装类。
所以,最好用int代替整数,或者用double代替double。这允许JVM将值存储在堆栈中而不是堆中,以减少内存消耗并更有效地处理它。
四、避免使用BigInteger
BigInteger和BigDecimal比简单的long或double需要更多的内存,大大降低了所有计算的速度。
因此,如果你需要额外的精度,或者如果你的数字将超过一个很长的范围,最好三思而后行。这可能是解决性能问题所需的唯一更改,尤其是在实现数学算法的情况下。
五、首先检查当前日志级别
在创建调试消息之前,应始终首先检查当前日志级别。否则,你可能会在日志消息中创建一个字符串,该字符串将在以后被忽略。
这里有两个不同的例子。
// 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));
在上面两种状况中,你都将在不知道日志结构是否将运用日志音讯的前提下,履行创立日志音讯一切必需的过程。因此在创立调试音讯之前,最好先查看当时的日志等级。
六、使用 StringUtils.Replace方法
如果你的应用程序需要大量替换操作,并且你还没有更新到最新的Java版本,那么检查更快、更高效的替代方案是有必要的。一个候选方法是Apache Commons Lang的StringUtils.replace方法,它的性能显著优于Java8的String.replace方法。
你需要将Apache的Commons Lang项目的Maven依赖项添加到应用程序pom.xml中,并将String.replace方法的所有调用替换为StringUtils.replace方法。
七、缓存昂贵的资源
缓存是一种流行的解决方案,可以避免重复执行昂贵或频繁使用的代码段。总的想法很简单:重用这样的资源比一次又一次地创建新资源要便宜。
一个典型的例子是在池中缓存数据库连接。创建新连接需要时间,如果重用现有连接,可避免这一点。还可以在Java语言本身中找到其他示例,比如,Integer类的valueOf方法缓存-128和127之间的值。可能创建一个新的整数并不贵,但它的使用非常频繁,因此缓存最常用的值可以提供性能优势。
但是当你考虑缓存时,请记住缓存实现也会产生开销。你需要花费额外的内存来存储可重用资源,并且可能需要管理缓存以使资源可访问或删除过时的资源。因此,在开始缓存任何资源之前,请确保使用它们的频率足以超过缓存实现的开销。
如你所见,有时并不需要做很多工作来提高应用程序的性能,小编这里的大多数建议只需要一点额外的努力就可以将它们应用到你的代码中。
今天的分享就到这里了,还在等什么?快点收藏起来运用到你代码中试试吧!