服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Java Benchmark 基准测试的实例详解

Java Benchmark 基准测试的实例详解

2020-12-16 13:30hpgary Java教程

这篇文章主要介绍了Java Benchmark 基准测试的实例详解的相关资料,这里提供实例帮助大家学习理解这部分内容,需要的朋友可以参考下

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

延伸 · 阅读

精彩推荐