xref: /aosp_15_r20/art/test/2239-varhandle-perf-vh-get-a/src/BenchmarkBase.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
1*795d594fSAndroid Build Coastguard Worker /*
2*795d594fSAndroid Build Coastguard Worker  * Copyright (C) 2014 The Android Open Source Project
3*795d594fSAndroid Build Coastguard Worker  *
4*795d594fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*795d594fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*795d594fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*795d594fSAndroid Build Coastguard Worker  *
8*795d594fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*795d594fSAndroid Build Coastguard Worker  *
10*795d594fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*795d594fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*795d594fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*795d594fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*795d594fSAndroid Build Coastguard Worker  * limitations under the License.
15*795d594fSAndroid Build Coastguard Worker  */
16*795d594fSAndroid Build Coastguard Worker 
17*795d594fSAndroid Build Coastguard Worker public class BenchmarkBase {
18*795d594fSAndroid Build Coastguard Worker   public final String name;
19*795d594fSAndroid Build Coastguard Worker 
20*795d594fSAndroid Build Coastguard Worker   // Empty constructor.
BenchmarkBase(String name)21*795d594fSAndroid Build Coastguard Worker   public BenchmarkBase(String name) {
22*795d594fSAndroid Build Coastguard Worker     this.name = name;
23*795d594fSAndroid Build Coastguard Worker   }
24*795d594fSAndroid Build Coastguard Worker 
25*795d594fSAndroid Build Coastguard Worker   // The benchmark code.
26*795d594fSAndroid Build Coastguard Worker   // This function is not used, if both [warmup] and [exercise] are overwritten.
run()27*795d594fSAndroid Build Coastguard Worker   public void run() throws Throwable { }
28*795d594fSAndroid Build Coastguard Worker 
29*795d594fSAndroid Build Coastguard Worker   // Runs a short version of the benchmark. By default invokes [run] once.
warmup()30*795d594fSAndroid Build Coastguard Worker   public void warmup() throws Throwable {
31*795d594fSAndroid Build Coastguard Worker     run();
32*795d594fSAndroid Build Coastguard Worker   }
33*795d594fSAndroid Build Coastguard Worker 
34*795d594fSAndroid Build Coastguard Worker   // Exercises the benchmark. By default invokes [run] 10 times.
exercise()35*795d594fSAndroid Build Coastguard Worker   public void exercise() throws Throwable {
36*795d594fSAndroid Build Coastguard Worker     for (int i = 0; i < 10; ++i) {
37*795d594fSAndroid Build Coastguard Worker       run();
38*795d594fSAndroid Build Coastguard Worker     }
39*795d594fSAndroid Build Coastguard Worker   }
40*795d594fSAndroid Build Coastguard Worker 
41*795d594fSAndroid Build Coastguard Worker   // Not measured setup code executed prior to the benchmark runs.
setup()42*795d594fSAndroid Build Coastguard Worker   public void setup() throws Throwable { }
43*795d594fSAndroid Build Coastguard Worker 
44*795d594fSAndroid Build Coastguard Worker   // Not measures teardown code executed after the benchark runs.
teardown()45*795d594fSAndroid Build Coastguard Worker   public void teardown() throws Throwable { }
46*795d594fSAndroid Build Coastguard Worker 
47*795d594fSAndroid Build Coastguard Worker   // Measures the score for this benchmark by executing it repeatedly until
48*795d594fSAndroid Build Coastguard Worker   // time minimum has been reached.
measureFor(boolean doWarmup, long timeMinimum)49*795d594fSAndroid Build Coastguard Worker   protected double measureFor(boolean doWarmup, long timeMinimum) throws Throwable {
50*795d594fSAndroid Build Coastguard Worker     int iter = 0;
51*795d594fSAndroid Build Coastguard Worker     long startTime = System.currentTimeMillis();
52*795d594fSAndroid Build Coastguard Worker     long elapsed = 0;
53*795d594fSAndroid Build Coastguard Worker     while (elapsed < timeMinimum) {
54*795d594fSAndroid Build Coastguard Worker       if (doWarmup) {
55*795d594fSAndroid Build Coastguard Worker         warmup();
56*795d594fSAndroid Build Coastguard Worker       } else {
57*795d594fSAndroid Build Coastguard Worker         exercise();
58*795d594fSAndroid Build Coastguard Worker       }
59*795d594fSAndroid Build Coastguard Worker       elapsed = System.currentTimeMillis() - startTime;
60*795d594fSAndroid Build Coastguard Worker       iter++;
61*795d594fSAndroid Build Coastguard Worker     }
62*795d594fSAndroid Build Coastguard Worker     return 1000.0 * elapsed / iter;
63*795d594fSAndroid Build Coastguard Worker   }
64*795d594fSAndroid Build Coastguard Worker 
65*795d594fSAndroid Build Coastguard Worker   // Measures the score for the benchmark and returns it.
measure()66*795d594fSAndroid Build Coastguard Worker   public double measure() throws Throwable {
67*795d594fSAndroid Build Coastguard Worker     setup();
68*795d594fSAndroid Build Coastguard Worker     // Warmup for at least 100ms. Discard result.
69*795d594fSAndroid Build Coastguard Worker     measureFor(true, 100);
70*795d594fSAndroid Build Coastguard Worker     // Run the benchmark for at least 1000ms.
71*795d594fSAndroid Build Coastguard Worker     double result = measureFor(false, 1000);
72*795d594fSAndroid Build Coastguard Worker     teardown();
73*795d594fSAndroid Build Coastguard Worker     return result;
74*795d594fSAndroid Build Coastguard Worker   }
75*795d594fSAndroid Build Coastguard Worker 
76*795d594fSAndroid Build Coastguard Worker   // Allow subclasses to override how the name is printed.
getName()77*795d594fSAndroid Build Coastguard Worker   public String getName() {
78*795d594fSAndroid Build Coastguard Worker     return name;
79*795d594fSAndroid Build Coastguard Worker   }
80*795d594fSAndroid Build Coastguard Worker 
report()81*795d594fSAndroid Build Coastguard Worker   public void report() throws Throwable {
82*795d594fSAndroid Build Coastguard Worker     double score = measure();
83*795d594fSAndroid Build Coastguard Worker     System.out.println(getName() + "(RunTime): " + score + " us.");
84*795d594fSAndroid Build Coastguard Worker   }
85*795d594fSAndroid Build Coastguard Worker }