/* * Copyright (C) 2011 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package benchmarks.regression; import com.google.caliper.SimpleBenchmark; import java.lang.reflect.Field; import java.lang.reflect.Method; public final class PropertyAccessBenchmark extends SimpleBenchmark { private View view = new View(); private Method setX; private GeneratedProperty generatedSetter = new GeneratedSetter(); private GeneratedProperty generatedField = new GeneratedField(); private Field x; private Object[] argsBox = new Object[1]; @Override protected void setUp() throws Exception { setX = View.class.getDeclaredMethod("setX", float.class); x = View.class.getDeclaredField("x"); } public void timeDirectSetter(int reps) { for (int i = 0; i < reps; i++) { view.setX(0.1f); } } public void timeDirectFieldSet(int reps) { for (int i = 0; i < reps; i++) { view.x = 0.1f; } } public void timeDirectSetterAndBoxing(int reps) { for (int i = 0; i < reps; i++) { Float value = 0.1f; view.setX(value); } } public void timeDirectFieldSetAndBoxing(int reps) { for (int i = 0; i < reps; i++) { Float value = 0.1f; view.x = value; } } public void timeReflectionSetterAndTwoBoxes(int reps) throws Exception { for (int i = 0; i < reps; i++) { setX.invoke(view, 0.1f); } } public void timeReflectionSetterAndOneBox(int reps) throws Exception { for (int i = 0; i < reps; i++) { argsBox[0] = 0.1f; setX.invoke(view, argsBox); } } public void timeReflectionFieldSet(int reps) throws Exception { for (int i = 0; i < reps; i++) { x.setFloat(view, 0.1f); } } public void timeGeneratedSetter(int reps) throws Exception { for (int i = 0; i < reps; i++) { generatedSetter.setFloat(view, 0.1f); } } public void timeGeneratedFieldSet(int reps) throws Exception { for (int i = 0; i < reps; i++) { generatedField.setFloat(view, 0.1f); } } static class View { float x; public void setX(float x) { this.x = x; } } static interface GeneratedProperty { void setFloat(View v, float f); } static class GeneratedSetter implements GeneratedProperty { public void setFloat(View v, float f) { v.setX(f); } } static class GeneratedField implements GeneratedProperty { public void setFloat(View v, float f) { v.x = f; } } }