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 > < 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