服务器之家

服务器之家 > 正文

Java Benchmark 基准测试的实例详解

时间:2020-12-16 13:30     来源/作者:hpgary

Java Benchmark 基准测试的实例详解

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
 
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Measurement;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.Threads;
import org.openjdk.jmh.annotations.Warmup;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
 
@BenchmarkMode(Mode.Throughput)//基准测试类型
@OutputTimeUnit(TimeUnit.SECONDS)//基准测试结果的时间类型
@Warmup(iterations = 3)//预热的迭代次数
@Threads(2)//测试线程数量
@State(Scope.Thread)//该状态为每个线程独享
//度量:iterations进行测试的轮次,time每轮进行的时长,timeUnit时长单位,batchSize批次数量
@Measurement(iterations = 2, time = -1, timeUnit = TimeUnit.SECONDS, batchSize = -1)
public class InstructionsBenchmark{
  static int staticPos = 0;
  //String src = "SELECT a FROM ab       , ee.ff AS f,(SELECT a FROM `schema_bb`.`tbl_bb`,(SELECT a FROM ccc AS c, `dddd`));";
  final byte[] srcBytes = {83, 69, 76, 69, 67, 84, 32, 97, 32, 70, 82, 79, 77, 32, 97, 98, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 44, 32, 101, 101, 46, 102, 102, 32, 65, 83, 32, 102, 44, 40, 83, 69, 76, 69, 67, 84, 32, 97, 32, 70, 82, 79, 77, 32, 96, 115, 99, 104, 101, 109, 97, 95, 98, 98, 96, 46, 96, 116, 98, 108, 95, 98, 98, 96, 44, 40, 83, 69, 76, 69, 67, 84, 32, 97, 32, 70, 82, 79, 77, 32, 99, 99, 99, 32, 65, 83, 32, 99, 44, 32, 96, 100, 100, 100, 100, 96, 41, 41, 59};
  int len = srcBytes.length;
  byte[] array = new byte[8192];
  int memberVariable = 0;
 
  //run
  public static void main(String[] args) throws RunnerException {
    Options opt = new OptionsBuilder()
        .include(InstructionsBenchmark.class.getSimpleName())
        .forks(1)
        //   使用之前要安装hsdis
        //-XX:-TieredCompilation 关闭分层优化 -server
        //-XX:+LogCompilation 运行之后项目路径会出现按照测试顺序输出hotspot_pid<PID>.log文件,可以使用JITWatch进行分析,可以根据最后运行的结果的顺序按文件时间找到对应的hotspot_pid<PID>.log文件
        .jvmArgs("-XX:+UnlockDiagnosticVMOptions", "-XX:+LogCompilation", "-XX:+TraceClassLoading", "-XX:+PrintAssembly")
        // .addProfiler(CompilerProfiler.class)  // report JIT compiler profiling via standard MBeans
        // .addProfiler(GCProfiler.class)  // report GC time
        // .addProfiler(StackProfiler.class) // report method stack execution profile
        // .addProfiler(PausesProfiler.class)
        /*
        WinPerfAsmProfiler
        You must install Windows Performance Toolkit. Once installed, locate directory with xperf.exe file
        and either add it to PATH environment variable, or set it to jmh.perfasm.xperf.dir system property.
         */
        //.addProfiler(WinPerfAsmProfiler.class)
        //更多Profiler,请看JMH介绍
        //.output("InstructionsBenchmark.log")//输出信息到文件
        .build();
    new Runner(opt).run();
  }
 
 
  //空循环 对照项
  @Benchmark
  public int emptyLoop() {
    int pos = 0;
    while (pos < len) {
      ++pos;
    }
    return pos;
  }
 
  @Benchmark
  public int increment() {
    int pos = 0;
    int result = 0;
    while (pos < len) {
      ++result;
      ++pos;
    }
    return result;
  }
 
  @Benchmark
  public int decrement() {
    int pos = 0;
    int result = 0;
    while (pos < len) {
      --result;
      ++pos;
    }
    return result;
  }
 
  @Benchmark
  public int ifElse() {
    int pos = 0;
    int result = 0;
    while (pos < len) {
      if (pos == 10) {
        ++result;
        ++pos;
      } else {
        ++pos;
      }
    }
    return result;
  }
 
  @Benchmark
  public int ifElse2() {
    int pos = 0;
    int result = 0;
    while (pos < len) {
      if (pos == 10) {
        ++result;
        ++pos;
      } else if (pos == 20) {
        ++result;
        ++pos;
      } else {
        ++pos;
      }
    }
    return result;
  }
 
  @Benchmark
  public int ifnotElse() {
    int pos = 0;
    int result = 0;
    while (pos < len) {
      if (pos != 10) {
        ++pos;
      } else {
        ++result;
        ++pos;
      }
    }
    return result;
  }
 
  @Benchmark
  public int ifLessthanElse() {
    int pos = 0;
    int result = 0;
    while (pos < len) {
      if (pos < 10) {
        ++pos;
      } else {
        ++result;
        ++pos;
      }
    }
    return result;
  }
 
  @Benchmark
  public int ifGreaterthanElse() {
    int pos = 0;
    int result = 0;
    while (pos < len) {
      if (pos > 10) {
        ++pos;
      } else {
        ++result;
        ++pos;
      }
    }
    return result;
  }
 
  @Benchmark
  public int readMemberVariable_a_byteArray() {
    int pos = 0;
    int result = 0;
    while (pos < len) {
      result = srcBytes[pos];
      pos++;
    }
    return result;
  }
 
}

 ops/time:标识每秒钟执行的次数

 依赖jar包:

?
1
2
3
4
5
6
7
8
9
10
11
<dependency>
      <groupId>org.openjdk.jmh</groupId>
      <artifactId>jmh-core</artifactId>
      <version>${jmh.version}</version>
    </dependency>
    <dependency>
      <groupId>org.openjdk.jmh</groupId>
      <artifactId>jmh-generator-annprocess</artifactId>
      <version>${jmh.version}</version>
      <scope>provided</scope>
    </dependency>
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>exec-maven-plugin</artifactId>
        <executions>
          <execution>
            <id>run-benchmarks</id>
            <phase>integration-test</phase>
            <goals>
              <goal>exec</goal>
            </goals>
            <configuration>
              <classpathScope>test</classpathScope>
              <executable>java</executable>
              <arguments>
                <argument>-classpath</argument>
                <classpath />
                <argument>org.openjdk.jmh.Main</argument>
                <argument>.*</argument>
              </arguments>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>

以上就是Java Benchmark 基准测试,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

原文链接:http://hpgary.iteye.com/blog/2360981

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
Intellij idea2020永久破解,亲测可用!!!
Intellij idea2020永久破解,亲测可用!!! 2020-07-29
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享
歪歪漫画vip账号共享2020_yy漫画免费账号密码共享 2020-04-07
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址
电视剧《琉璃》全集在线观看 琉璃美人煞1-59集免费观看地址 2020-08-12
最新idea2020注册码永久激活(激活到2100年)
最新idea2020注册码永久激活(激活到2100年) 2020-07-29
返回顶部