原标题:Java性能优化技巧整理,做一个深度的程序员

在我们身边是一大批的程序员,层次不一,但是放眼观,我们很容易就可以看到那些是业务型程序员,那些是有层次的程序员。注重细节,注重性能,做一个有深度的程序员吧!

1. 在明确必要之前别急着优化

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

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

4. 优先关注最大瓶颈

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

6. 尽可能使用基本类型

7. 尽量避免大整数和小数

8. 使用 Apache Commons StringUtils.Replace 而不是 String.replace

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

总结

大多数开发者认为性能优化是一个复杂的话题,它需要大量的工作经验和相关知识理论。好吧,这也不完全错。优化一个应用做到性能最优化可能不是件容易的任务,但是这并不意味着你没有相关的知识就什么也做不了。这里有一些易于遵循的建议和最佳实践可以帮助你创建一个性能良好的应用程序。

这些建议的大部分都是针对 Java 语言的。但是也有一些是跟语言无关的,你可以运用到任意的应用和程序中。在我们学习特定的 Java 编程性能调优之前,先来探讨一些通用的技巧。

1. 在明确必要之前别急着优化

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

多数情况下,过早地优化会占用大量的时间,而且会使代码变得难以理解和阅读。更糟糕的是,这些优化通常并没带来任何好处,因为你花了大量的时间在优化应用中的非关键部分。

那么,要怎么证明东西需要优化呢?

首先,你需要定义你的代码速度得多快。例如,为所有 API 调用指定最大响应时间,或者指定在特定时间范围内要导入的记录数量。在做完这些后,你需要确定你应用中哪些部分太慢需要改进。当完成这些后,你就可以来看看第二个技巧提示。

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

在完成第一部分的优化建议以鉴别出你应用中需要提升的部分后,要从哪里入手呢?

你可以有两种途径来解决这个问题:

1、查看你的代码,从看起来可疑的或者你觉得可能会导致出现问题的地方入手。

2、或者使用分析器获取代码每个部分的行为(执行过程)和性能的详细信息。

希望我不需要解释为什么应该始终遵循第二种途径/方法的原因。

很显然,基于分析器的方式可以让你更好地理解代码的性能影响,并允许你去专注于更关键的部分(代码)。即使你曾经使用过分析器,你一定记得你曾经多么惊讶于一下就找到了代码的哪些部分产生了性能问题。我第一次的猜测不止一次地导致我走错了方向。

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

这是另一个通用的可以帮助你避免在将性能改进部署到产品中之后经常会发生的许多意外问题的技巧。你应该总是定义一个性能测试套件来测试整个应用程序,并在性能改进之前和之后运行它。

这些额外的测试运行将帮助你识别你的改动所引起的功能和性能上的副作用,并确保不会导致弊大于利的更新。如果你处理的是被应用程序的多个不同部分使用的组件,如数据库或缓存,那这一点尤为重要。

4. 优先关注最大瓶颈

在创建了测试套件并使用分析器分析你的应用程序之后,你可以列出一系列需要解决以提高性能的问题列表。这很好,但这并没有回答你需要从哪里开始的问题。你可以专注于速成方案,或从最重要的问题开始。

速成方案一开始可能会很有吸引力,因为你可以很快显示第一个成果。但有时,可能有必要说服其他团队成员或管理层认为性能分析是值得的。

一般来说,我建议从顶层开始,首先开始处理最重要的性能问题。这将为你提供最大的性能改进,而且你可能仅需要解决这些问题中的一小部分就能满足你的性能要求。

常见的通用调优技巧到此结束。接下来让我们仔细看看一些特定于 Java 的技巧。

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

在 Java 中有很多不同的选项来连接字符串。例如,你可以使用简单的 + 或 + = ,以及老的 StringBuffer 或 StringBuilder 。

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

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

你只需要实例化一个新的 StringBuilder 并调用append方法来向String中添加一个新的部分。在你添加完了所有的部分后,你可以调用toString()方法来检索已连接的字符串。 下面的代码片段展示了一个简单的例子。在每次迭代期间,该循环将 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());

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

如果你已经知道字符串将包含多少个字符,则可以将该数字提供给不同的构造方法以实例化具有指定容量的 StringBuilder 。这进一步提高了效率,因为它不需要动态扩展其容量。

6. 尽可能使用基本类型

避免任何开销并提高应用程序性能的另一种简便快速的方法是使用基本类型而不是其包装类。所以,最好使用 int 而不是 Integer ,是 double 而不是 Double 。这将使得你的 JVM 将值存储在堆栈而不是堆中,以减少内存消耗,并更有效地处理它。

7. 尽量避免大整数和小数

由于我们已经在讨论数据类型,所以我们也应该快速浏览大整数和小数。尤其是后者因其精确性而受欢迎。但这是有代价的。 大整数和小数比一个简单的 long 型或 double 型需要更多的内存,并会显著减慢所有的运算。所以,如果你需要额外的精度,或者如果你的数字超出一个较长的范围,最好要三思。这可能是你需要更改并解决性能问题的唯一方法,尤其是在实现数学算法时。

8. 使用 Apache Commons StringUtils.Replace 而不是 String.replace

一般来说,String.replace 方法可以正常工作,并且效率很高,尤其是在你使用 Java 9 的情况下。但是,如果你的应用程序需要大量的替换操作,并且没有更新到最新的 Java 版本,那么检查更快和更有效的替代品依然是有必要的。

有一种候选方案是 Apache Commons Lang 的 StringUtils.replace 方法。正如 Lukas Eder 在他最近的一篇博客文章中所描述的,它远远胜过了 Java 8 的 String.replace 方法。

而且它只需要很小的改动。你只需要将 Apache Commons Lang 项目的 Maven 依赖项添加到你的应用程序的 pom.xml 中,并将 String.replacemethod 的所有调用替换为 StringUtils.replace 方法。

// replace this

test.replace(“test”, “simple test”);

// with this

StringUtils.replace(test, “test”, “simple test”);

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

缓存是避免重复执行昂贵或常用代码片段的流行解决方案。总的思路很简单:重复使用这些资源比创建一个新的资源更划算。

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

你也可以在 Java 语言源码中找到其他的例子。例如,在 Integer 类中的 valueOf 方法缓存了介于 -128 到 127 之间的值。你可能会说创建一个新的 Integer 并不是太昂贵,但是由于它经常被使用,因此缓存最常用的值也可以提供性能优势。

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

所以,在开始缓存任何资源之前,请确保它们是经常使用的,以超过缓存实现的开销(代价)。

总结

正如你所看到的,有时不需要太多的工作就可以提高你的应用程序的性能。本文中的大部分建议只需要稍作努力就可以将它们应用于你的代码中。

但还是那句话,最重要的还是那些与是什么编程语言无关的技巧:

1、在你知道其必要性之前不要进行优化

2、使用分析器(profiler)来查找真正的瓶

3、优先处理最大的瓶颈

来源网络,侵权联系删除返回搜狐,查看更多

责任编辑:

java性能瓶颈分析_Java性能优化技巧整理,做一个深度的程序员相关推荐

  1. java split()方法_Java 性能优化的 50 个细节(珍藏版)

    作 者:Java杂记 来 源:yq.aliyun.com/articles/662001 在Java程序中,性能问题的大部分原因并不在于Java语言,而是程序本身.养成良好的编码习惯非常重要,能够显著 ...

  2. java list最大容量_Java 性能优化:35 个小细节,提升你的 Java 代码运行效率

    优质文章,及时送达 作者 | 萌小Q 来源 | cnblogs.com/Qian123/p/6046096.html 上篇 | 为什么我不建议你去外包公司? 前言 代码优化 ,一个很重要的课题.可能有 ...

  3. 【总结】SQL性能优化技巧整理汇总

    背景 一开始会用SQL时,无非都是照着 [select from where group by order by] 这个格式套来套去:从来不会关注 SQL 的耗费时长,更不会关注查询的性能.但是,当用 ...

  4. 【java 性能优化实战】1 理论分析:性能优化,有哪些衡量指标、性能优化的技术手段

    指标是我们衡量很多事物,以及做出行为决策的重要参考.例如在生活中,当你打算买汽车时,会关注很多指标,比如动力性.燃油经济性.制动性.操纵稳定性.平顺性.通过性.排放与噪声等,而这些指标也都有相关的测试 ...

  5. Java性能优化技巧

    Java性能优化技巧 参考了些书籍,网络资源整理出来,适合于大多数Java应用 在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良好的编码习惯非常重要,能够显著地提升程序 ...

  6. python linux 优化_Python 代码性能优化技巧

    Python 性能优化除了改进算法,选用合适的数据结构之外,还有几种关键的技术,比如将关键 python 代码部分重写成 C 扩展模块,或者选用在性能上更为优化的解释器等,这些在本文中统称为优化工具. ...

  7. python代码性能优化技巧

    python代码性能优化技巧 代码优化能够让程序运行更快,可以提高程序的执行效率等,对于一名软件开发人员来说,如何优化代码,从哪里入手进行优化?这些都是他们十分关心的问题.本文着重讲了如何优化Pyth ...

  8. [转载] Python性能优化技巧总结

    参考链接: Python代码的优化技巧 欢迎加入Python学习交流群:535993938  禁止闲聊 ! 名额有限 ! 非喜勿进 ! 选择了脚本语言就要忍受其速度,这句话在某种程度上说明了 pyth ...

  9. SQL性能优化技巧,常见优化10经验,数据库查询好慢,还能怎么办

    我熟练应用ctrl c和ctrl v 开发curd代码好多年了. mysql查询为什么会慢,关于这个问题,在实际开发经常会遇到,而面试中,也是个高频题. 遇到这种问题,我们一般也会想到是因为索引. 那 ...

最新文章

  1. github一些常见命令
  2. mysql 导入导出摘要
  3. 图形基础 GPU架构(4)GPU CPU
  4. Hiernate 笔记
  5. 四步法分析定位生产环境下MySQL上千条SQL中的问题所在
  6. easybcd android x86,【图片】不需U盘,简单三步,Win系统变Win+Android双系统!【androidx86吧】_百度贴吧...
  7. 漫步线性代数十九——快速傅里叶变换(上)
  8. 尤克里里怎么样_尤克里里入门简单教程
  9. Firefox 差点就赢了第二次浏览器大战!
  10. Python进阶【第九篇】装饰器
  11. 程序员的相亲那件小事,指南献给您
  12. mnist 转图像_解决MNIST图像分类问题
  13. 微分方程模型_天生一对,硬核微分方程与深度学习的「联姻」之路
  14. [Matlab] 单次测量的中误差、算数平均值的中误差、加权求最或然值、函数拟合、莫迪图的计算实例
  15. C#金额转大写的方法
  16. Could not autowire. No beans of xxx 解决办法
  17. Word处理控件Aspose.Words功能演示:使用 Python 合并 Word 文档
  18. 微信小程序设置页面背景颜色
  19. 打开 CMD 的方式+常用的Dos命令
  20. 残疾人求职阿里巴巴等了八年!好辛苦!

热门文章

  1. 战地5服务器不显示ping怎么回事,战地5常见bug解决办法分享
  2. list中去除连续重复的值并保留头尾2个和头尾2个值在原list中的索引
  3. 运行Docker时不加sudo
  4. C++新特性探究(18.3):C++11 weak_ptr智能指针
  5. 玩冒险岛java卸载_如何删除冒险岛安装了,现在不想玩
  6. 互联网+大赛作品_【快讯】智物联获第二届中国工业互联网大赛优秀作品奖
  7. php 微信获取code,微信网页授权接口为什么获取不到code(已解决)
  8. linux strace cpu,如何定位死循环或高CPU使用率(linux)
  9. MongoDB Project Fields
  10. Pandas Apply函数