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 }