代码精进之路
范学雷
Oracle首席软件工程师,Java SE安全组成员,OpenJDK评审成员
立即订阅
6350 人已学习
课程目录
已完结 47 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词 | 你写的每一行代码,都是你的名片
免费
第一模块:代码“规范”篇 (16讲)
01 | 从条件运算符说起,反思什么是好代码
02 | 把错误关在笼子里的五道关卡
03 | 优秀程序员的六个关键特质
04 | 代码规范的价值:复盘苹果公司的GoToFail漏洞
05 | 经验总结:如何给你的代码起好名字?
06 | 代码整理的关键逻辑和最佳案例
07 | 写好注释,真的是小菜一碟吗?
08 | 写好声明的“八项纪律”
09 | 怎么用好Java注解?
10 | 异常处理都有哪些陷阱?
11 | 组织好代码段,让人对它“一见钟情”
12丨组织好代码文件,要有“用户思维”
13 | 接口规范,是协作的合约
14 | 怎么写好用户指南?
15 | 编写规范代码的检查清单
16丨代码“规范”篇用户答疑
第二模块:代码“经济”篇 (14讲)
17 | 为什么需要经济的代码?
18丨思考框架:什么样的代码才是高效的代码?
19 | 怎么避免过度设计?
20 | 简单和直观,是永恒的解决方案
21 | 怎么设计一个简单又直观的接口?
22丨高效率,从超越线程同步开始!
23 | 怎么减少内存使用,减轻内存管理负担?
24 | 黑白灰,理解延迟分配的两面性
25 | 使用有序的代码,调动异步的事件
26 | 有哪些招惹麻烦的性能陷阱?
27 | 怎么编写可持续发展的代码?
28 | 怎么尽量“不写”代码?
29 | 编写经济代码的检查清单
30丨“代码经济篇”答疑汇总
第三模块:代码“安全”篇 (14讲)
31 | 为什么安全的代码这么重要?
32 | 如何评估代码的安全缺陷?
33 | 整数的运算有哪些安全威胁?
34 | 数组和集合,可变量的安全陷阱
35 | 怎么处理敏感信息?
36 | 继承有什么安全缺陷?
37 | 边界,信任的分水岭
38 | 对象序列化的危害有多大?
39 | 怎么控制好代码的权力?
40 | 规范,代码长治久安的基础
41 | 预案,代码的主动风险管理
42 | 纵深,代码安全的深度防御
43 | 编写安全代码的最佳实践清单
44 | “代码安全篇”答疑汇总
加餐 (1讲)
Q&A加餐丨关于代码质量,你关心的那些事儿
结束语 (1讲)
结束语|如何成为一个编程好手?
代码精进之路
登录|注册

26 | 有哪些招惹麻烦的性能陷阱?

范学雷 2019-03-04
前面,我们讨论了改善代码性能的最基本的办法。接下来,我们讨论一些最佳实践,让我们先从一些容易被忽略的性能陷阱开始。

使用性能测试工具

今天我们的讲解需要用到一个工具,它就是 JMH。JMH 是为 Java 语言或者其他基于 JVM 的编程语言设计的一个基准测试工具。这一节,我们会使用这个工具来分析一些性能的陷阱。这里我们简单地介绍下,这个工具该怎么使用。
第一步,使用 Maven 工具建立一个基准测试项目(需要使用 Maven 工具):
$ mvn archetype:generate \
-DinteractiveMode=false \
-DarchetypeGroupId=org.openjdk.jmh \
-DarchetypeArtifactId=jmh-java-benchmark-archetype \
-DgroupId=com.example \
-DartifactId=myJmh \
-Dversion=1.0
这个命令行,会生成一个 myJmh 的工程目录,和一个基准测试模板文件(myJmh/src/main/java/com/example/MyBenchmark.java)。通过更改这个测试模板,就可以得到你想要的基准测试了。
比如,你可以使用后面我们用到的基准测试代码,替换掉模板中的基准测试方法(measureStringApend)。
package com.example;
import org.openjdk.jmh.annotations.Benchmark;
public class MyBenchmark {
@Benchmark
public String measureStringApend() {
String targetString = "";
for (int i = 0; i < 10000; i++) {
targetString += "hello";
}
return targetString;
}
}
第二步,编译基准测试:
$ cd myJmh
$ mvn clean install
第三步,运行你的基准测试:
$ cd myJmh
$ Java -jar target/benchmarks.jar
稍微等待,基准测试结果就出来了。我们需要关注的是"Score"这一栏,它表示的是每秒钟可以执行的基准测试方法的次数。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《代码精进之路》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(4)

  • 夕夏洛克
    老师这是我用jmh 跑出的性能数据 为什么 string的性能是最好的呢
    MyBenchmark.stringMethod thrpt 25 15.036 ± 1.045 ops/s
    MyBenchmark.stringBufferMethod thrpt 25 7689.300 ± 367.812 ops/s
    MyBenchmark.stringBuilderMethod thrpt 25 7690.659 ± 251.793 ops/s

    作者回复: 首先要点赞动手使用JMH测试代码性能,这就迈开了步子,这一步最难的。

    测试代码什么样的?使用的是文章中的代码吗?数据是每秒执行操作数,越大越好。

    2019-03-06
    4
  • 小小
    老师,能推荐JMH快速入门的博客吗?减少大家查找信息成本。

    作者回复: 可以参考下面的链接。https://openjdk.java.net/projects/code-tools/jmh/
    http://tutorials.jenkov.com/java-performance/jmh.html
    https://blog.goyello.com/2017/06/19/testing-code-performance-jmh-tool/
    https://www.baeldung.com/java-microbenchmark-harness

    其中,第一个链接里,还可以深入看一下JMH官方的例子:
    https://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/

    中文的,请参考:
    http://blog.dyngr.com/blog/2016/10/29/introduction-of-jmh/
    https://www.xncoding.com/2018/01/07/java/jmh.html

    2019-05-22
    1
  • 空知
    @夕夏洛克 查了下 JMH有四种模式,Throughput是吞吐量,单位时间内处理请求数,越大越好, 注解@BenchmarkMode(Mode.Throughput)可以修改模式
    2019-03-07
    1
  • 往事随风,顺其自然
    存在拆箱和装箱的转换问题,比较耗费资源
    2019-03-05
收起评论
4
返回
顶部