大多数开发人员都认为性能优化是一个复杂的主题,需要大量的经验和知识。优化应用程序以获得最佳性能并非易事。有几个易于遵循的建议和最佳实践可帮助你创建性能良好的应用程序,这些建议中的大多数是特定于Java的。
1.使用StringBuilder以编程方式连接字符串
在Java中有很多不同的连接字符串的选项。例如,你可以使用简单的+或+=、良好的旧StringBuffer或StringBuilder。
那么,你应该选择哪种方法?
答案取决于连接字符串的代码。如果以编程方式向字符串添加新内容,例如在for循环中,则应使用StringBuilder。它易于使用,并提供比StringBuffer更好的性能。但请记住,与StringBuffer相比,StringBuilder不是线程安全的,可能不适合所有用例。
你只需要实例化一个新的StringBuilder并调用append方法向字符串中添加一个新的部分。添加完所有部分后,可以调用toString()方法来检索连接的字符串。
如果你已经知道字符串将包含多少个字符,则可以将该数字提供给不同的构造函数方法,以实例化具有定义容量的StringBuilder。这将进一步提高其效率,因为它不需要动态扩展其容量。
2.使用+在一条语句中连接字符串
当你用Java实现第一个应用程序时,可能有人告诉你不应该将字符串与+。如果在应用程序逻辑中连接字符串,这是正确的。字符串是不可变的,每个字符串连接的结果都存储在一个新的字符串对象中。这需要额外的内存并降低应用程序的速度,尤其是在循环中连接多个字符串时。在这些情况下,你应该遵循第一条技巧并使用StringBuilder。
但如果你只是将一个字符串拆分为多行以提高代码的可读性,则情况并非如此。在这些情况下,你应该使用简单的+连接字符串。Java编译器将对此进行优化,并在编译时执行连接。因此,在运行时,你的代码将只使用1个字符串,不需要串联。
3.尽可能使用Primitives
另一种避免任何开销并提高应用程序性能的快速简便方法是使用Primitives而不是它们的包装类。所以,最好用int代替整数,或者用double代替double。这允许JVM将值存储在堆栈中而不是堆中,以减少内存消耗并更有效地处理它。
4.尽量避免使用BigInteger和BigDecimal
BigInteger和BigDecimal比简单的long或double需要更多的内存,大大降低了所有计算的速度。因此,如果你需要额外的精度,或者如果你的数字将超过一个很长的范围,最好三思而后行。这可能是解决性能问题所需的唯一更改,尤其是在实现数学算法的情况下。
5.首先检查当前日志级别
这个建议应该是显而易见的,但不幸的是,你可以找到许多忽略它的代码。在创建调试消息之前,应始终首先检查当前日志级别。否则,你可能会在日志消息中创建一个字符串,该字符串将在以后被忽略。
6.使用Apache Commons StringUtils.Replace而不是String.Replace
如果你的应用程序需要大量替换操作,并且你还没有更新到最新的Java版本,那么检查更快、更高效的替代方案仍然是有意义的。
一个候选方法是Apache Commons Lang的StringUtils.replace方法,它的性能显著优于Java8的String.replace方法。它只需要一点小小的改变。你需要将Apache的Commons Lang项目的Maven依赖项添加到应用程序pom.xml中,并将String.replace方法的所有调用替换为StringUtils.replace方法。
7.缓存昂贵的资源,如数据库连接
缓存是一种流行的解决方案,可以避免重复执行昂贵或频繁使用的代码段。总的想法很简单:重用这样的资源比一次又一次地创建新资源要便宜。
一个典型的例子是在池中缓存数据库连接。创建新连接需要时间,如果重用现有连接,可以避免这一点。你还可以在Java语言本身中找到其他示例。例如,Integer类的valueOf方法缓存-128和127之间的值。你可能会说,创建一个新的整数并不太昂贵,但它的使用非常频繁,因此缓存最常用的值可以提供性能优势。
但是当你考虑缓存时,请记住缓存实现也会产生开销。你需要花费额外的内存来存储可重用资源,并且可能需要管理缓存以使资源可访问或删除过时的资源。因此,在开始缓存任何资源之前,请确保使用它们的频率足以超过缓存实现的开销。
正如你所看到的,有时不需要做很多工作来提高应用程序的性能。本文中的大多数建议只需要一点额外的努力就可以将它们应用到你的代码中。
暂无评论内容