文档章节

如何度量你的程序的性能

麦田小圈圈
 麦田小圈圈
发布于 2016/12/23 18:24
字数 420
阅读 18
收藏 1

Java下如何做基准测试

你是否经常用这样的代码来度量代码性能:

public static void main(String[] args) {
    long t1 = System.nanoTime();
    int result = 0;
    for (int i = 0; i < 1000 ; i++) { 
       result +=i;
    }
    long t2 = System.nanoTime();
    System.out.println("Execution time: " + ((t2 - t1) * 1e-9) +
        " seconds to compute result = " + result);
}

那么,你应该继续往下看.

基准测试面临的问题

仔细阅读 《健壮的 Java 基准测试》 这篇文章,详细介绍了Java基准测试面临的问题,和需要考虑的方方面面,尽管文章年代久远,但并未过时.

基准测试框架(JMH)

阅读完上面这篇文章后, 我们就来试试 jmh,java下的微基础测试框架.

配置工程

首先你需要新建一个maven工程(在你的工作过程上,建一个maven模块也行),然后以依赖的方式可以访问到你被测试的代码.然后再添加jmh依赖:

       <dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-core</artifactId>
            <version>1.4.1</version>
        </dependency>
        <dependency>
            <groupId>org.openjdk.jmh</groupId>
            <artifactId>jmh-generator-annprocess</artifactId>
            <version>1.4.1</version>
            <scope>provided</scope>
        </dependency>

配置插件:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <compilerVersion>${javac.target}</compilerVersion>
                    <source>${javac.target}</source>
                    <target>${javac.target}</target>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.2</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <finalName>benchmarks</finalName>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>org.openjdk.jmh.Main</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>

    </build>

maven-shade-plugin 插件的主要作用是将所有的代码依赖打包在一个jar中.

编写测试代码

public class MyBenchmark {
    
    @Benchmark
    public void test() {
        //被测试方法调用
    }
}

执行

  • mvn clean package
  • java -jar target/benchmarks.jar

得到结果

Result: 108420.575 ±(99.9%) 402.469 ops/s [Average] Statistics: (min, avg, max) = (102205.984, 108420.575, 113070.541), stdev = 1704.079 Confidence interval (99.9%): [108018.106, 108823.044]

© 著作权归作者所有

共有 人打赏支持
麦田小圈圈

麦田小圈圈

粉丝 67
博文 6
码字总数 6021
作品 0
成都
高级程序员
私信 提问
图片和图形之性能和视图层次结构(18)

原文 概要 您管理View对象层次结构的方式可能会对应用程序的性能产生重大影响。本页介绍如何评估您的视图层次结构是否会减慢您的应用程序,并提供解决可能出现的问题的一些策略。 布局和衡量...

lichong951
2018/05/26
0
0
服务器性能指标:拨开服务器评测体系迷雾

用户总希望有一种简单、高效的度量标准,来量化评价服务器系统,以便作为选型的依据。但实际上,服务器的系统性能很难用一两种指标来衡量。包括 TPC、SPEC、SAP SD、Linpack和HPCC在内的众多...

shezjl
2015/06/15
0
0
《软件开发沉思录》之实用主义性能测试

学习了《软件开发沉思录》中的实用主义性能测试,对重点内容做下记录: 性能测试应该囊括确保产品性能符合要求所需的一切行动。这里有四个关键点:需求、产品性能数据、沟通和流程。 1.需求采...

flynewton
2010/12/14
0
0
虎牙数万主播同时在线直播的秘密,CDN推流日志上行实时监控

6 月 10 日,又拍云 Open Talk | 2018 音视频技术沙龙·深圳站 顺利落幕,来自虎牙的直播运维研发架构师张波在沙龙上做了《基于CDN推流日志的主播上行实时监控及其自动化解密》的分享。虎牙直...

又拍云
2018/07/04
0
0
软件测试复习概念重点

软件测试复习概念重点 测试团队的基本责任如下 1.发现软件程序、系统或者产品中的所有的问题 2.尽早的发现问题 3.督促和协助开发人员尽快的解决程序中的缺陷 4.帮助项目管理人员制定合理的开...

开源中国段子手
2015/12/25
125
2

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
8
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
3
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
3
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部