197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes/* 297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * Copyright (C) 2011 The Android Open Source Project 397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * 497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * you may not use this file except in compliance with the License. 697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * You may obtain a copy of the License at 797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * 897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * 1097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * Unless required by applicable law or agreed to in writing, software 1197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 1297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * See the License for the specific language governing permissions and 1497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes * limitations under the License. 1597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes */ 1697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 1797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughespackage benchmarks.regression; 1897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 19ea13f8291a92b6f47f50011da1d5e8c107984bc3Paul Duffinimport com.google.caliper.BeforeExperiment; 2097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughesimport java.lang.reflect.Field; 2197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughesimport java.lang.reflect.Method; 2297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 23ea13f8291a92b6f47f50011da1d5e8c107984bc3Paul Duffinpublic final class PropertyAccessBenchmark { 2497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes private View view = new View(); 2597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes private Method setX; 2697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes private GeneratedProperty generatedSetter = new GeneratedSetter(); 2797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes private GeneratedProperty generatedField = new GeneratedField(); 2897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes private Field x; 2997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes private Object[] argsBox = new Object[1]; 3097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 31ea13f8291a92b6f47f50011da1d5e8c107984bc3Paul Duffin @BeforeExperiment 32ea13f8291a92b6f47f50011da1d5e8c107984bc3Paul Duffin protected void setUp() throws Exception { 3397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes setX = View.class.getDeclaredMethod("setX", float.class); 3497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes x = View.class.getDeclaredField("x"); 3597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 3697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 3797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeDirectSetter(int reps) { 3897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int i = 0; i < reps; i++) { 3997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes view.setX(0.1f); 4097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 4197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 4297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 4397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeDirectFieldSet(int reps) { 4497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int i = 0; i < reps; i++) { 4597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes view.x = 0.1f; 4697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 4797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 4897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 4997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeDirectSetterAndBoxing(int reps) { 5097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int i = 0; i < reps; i++) { 5197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Float value = 0.1f; 5297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes view.setX(value); 5397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 5497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 5597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 5697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeDirectFieldSetAndBoxing(int reps) { 5797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int i = 0; i < reps; i++) { 5897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes Float value = 0.1f; 5997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes view.x = value; 6097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 6197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 6297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 6397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeReflectionSetterAndTwoBoxes(int reps) throws Exception { 6497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int i = 0; i < reps; i++) { 6597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes setX.invoke(view, 0.1f); 6697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 6797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 6897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 6997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeReflectionSetterAndOneBox(int reps) throws Exception { 7097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int i = 0; i < reps; i++) { 7197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes argsBox[0] = 0.1f; 7297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes setX.invoke(view, argsBox); 7397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 7497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 7597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 7697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeReflectionFieldSet(int reps) throws Exception { 7797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int i = 0; i < reps; i++) { 7897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes x.setFloat(view, 0.1f); 7997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 8097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 8197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 8297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeGeneratedSetter(int reps) throws Exception { 8397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int i = 0; i < reps; i++) { 8497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes generatedSetter.setFloat(view, 0.1f); 8597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 8697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 8797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 8897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void timeGeneratedFieldSet(int reps) throws Exception { 8997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes for (int i = 0; i < reps; i++) { 9097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes generatedField.setFloat(view, 0.1f); 9197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 9297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 9397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 9497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes static class View { 9597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes float x; 9697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 9797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void setX(float x) { 9897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes this.x = x; 9997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 10097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 10197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 10297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes static interface GeneratedProperty { 10397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes void setFloat(View v, float f); 10497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 10597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 10697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes static class GeneratedSetter implements GeneratedProperty { 10797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void setFloat(View v, float f) { 10897aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes v.setX(f); 10997aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 11097aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 11197aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes 11297aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes static class GeneratedField implements GeneratedProperty { 11397aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes public void setFloat(View v, float f) { 11497aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes v.x = f; 11597aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 11697aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes } 11797aba27f961a5a6f37dcaf7f455df371e250ede3Elliott Hughes} 118