java性能分析记录
PRE: 优秀的架构设计是基础,遵循基本设计原则,优化设计,但不用过度设计。
1.代码优化到需要时再做,写代码时注意不要犯严重的性能问题,正在有性能问题时再优化。
性能的决定性因素很多体现在架构 和 设计层面,代码层面最需要做到的是,不用犯低级错误,不需要过多拘泥于一点点的性能提升而写出极其复杂的代码,很有可能会造成更大的问题,得不偿失。
2.使用分析器查找真正的瓶颈
使用工具。
在你遵循第一个建议并确定了应用程序的某些部分需要改进后,那么从哪里开始呢?
你可以用两种方法来解决问题:
- 查看你的代码,并从看起来可疑或者你觉得可能会产生问题的部分开始。
- 或者使用分析器并获取有关代码每个部分的行为和性能的详细信息。
希望不需要我解释为什么应该始终遵循第二种方法的原因。
很明显,基于分析器的方法可以让你更好地理解代码的性能影响,并使你能够专注于最关键的部分。如果你曾使用过分析器,那么你一定记得曾经你是多么惊讶于一下就找到了代码的哪些部分产生了性能问题。老实说,我第一次的猜测不止一次地导致我走错了方向。
实践:
3.为整个应用程序创建性能测试套件
沉淀工具和整套操作方法流程。
这是另一个通用技巧,可以帮助你避免在将性能改进部署到生产后经常会发生的许多意外问题。你应该总是定义一个测试整个应用程序的性能测试套件,并在性能改进之前和之后运行它。
这些额外的测试运行将帮助你识别更改的功能和性能副作用,并确保不会导致弊大于利的更新。如果你工作于被应用程序若干不同部分使用的组件,如数据库或缓存,那么这一点就尤其重要。
实践:
一些实例(持续补充):
1.性能挑战赛,按照给定规则读取和处理大量磁盘数据
背景: 存储 一批80G左右json数据到磁盘,数据长度可变1k-10k。数据id自增加。 value字段是随机long型。
查询: 给定id范围 内的 给定 value范围的json对象。
统计:给定id范围 内的 给定 value范围的json对象里的 value值的平局值。
java基础: direct memory的方式 映射磁盘和内存
思考和验证历程:
0,基本思路:按段存数据,根据id拿对应的段,再取每条数据对比value的值,返回和计算。 结果: 功能实现,性能一般。
1, 数据预处理: 预先算好一整段的 平均值,如果最后结果包含这一整段,一次计算一直使用。 结果:最终需要的数据占总量的1%,所以预先算好的被使用少,没有提升
2. 数据连续读取性能提升:增大段的长度。 结果:磁盘一次取数据4K以上基本性能已经差不多,不需要连续太多
3. 多线程读取:多开启几个线程同时处理。 结果:磁盘是瓶颈, 多线程反而耗时更长。
最终技术方案:
分段存储, 数据分段存储 ,段与段之间 ,id增加。 段内 value递增。 结果: 每次先算出需要从哪几个段取数据,再通过value值范围算出取哪段里哪一部分数据,减少了数据的读取量,性能提升很大。
2.