1/*
2 * Copyright (C) 2011 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package benchmarks.regression;
18
19import com.google.caliper.BeforeExperiment;
20import java.lang.reflect.Field;
21import java.lang.reflect.Method;
22
23public final class PropertyAccessBenchmark {
24    private View view = new View();
25    private Method setX;
26    private GeneratedProperty generatedSetter = new GeneratedSetter();
27    private GeneratedProperty generatedField = new GeneratedField();
28    private Field x;
29    private Object[] argsBox = new Object[1];
30
31    @BeforeExperiment
32    protected void setUp() throws Exception {
33        setX = View.class.getDeclaredMethod("setX", float.class);
34        x = View.class.getDeclaredField("x");
35    }
36
37    public void timeDirectSetter(int reps) {
38        for (int i = 0; i < reps; i++) {
39            view.setX(0.1f);
40        }
41    }
42
43    public void timeDirectFieldSet(int reps) {
44        for (int i = 0; i < reps; i++) {
45            view.x = 0.1f;
46        }
47    }
48
49    public void timeDirectSetterAndBoxing(int reps) {
50        for (int i = 0; i < reps; i++) {
51            Float value = 0.1f;
52            view.setX(value);
53        }
54    }
55
56    public void timeDirectFieldSetAndBoxing(int reps) {
57        for (int i = 0; i < reps; i++) {
58            Float value = 0.1f;
59            view.x = value;
60        }
61    }
62
63    public void timeReflectionSetterAndTwoBoxes(int reps) throws Exception {
64        for (int i = 0; i < reps; i++) {
65            setX.invoke(view, 0.1f);
66        }
67    }
68
69    public void timeReflectionSetterAndOneBox(int reps) throws Exception {
70        for (int i = 0; i < reps; i++) {
71            argsBox[0] = 0.1f;
72            setX.invoke(view, argsBox);
73        }
74    }
75
76    public void timeReflectionFieldSet(int reps) throws Exception {
77        for (int i = 0; i < reps; i++) {
78            x.setFloat(view, 0.1f);
79        }
80    }
81
82    public void timeGeneratedSetter(int reps) throws Exception {
83        for (int i = 0; i < reps; i++) {
84            generatedSetter.setFloat(view, 0.1f);
85        }
86    }
87
88    public void timeGeneratedFieldSet(int reps) throws Exception {
89        for (int i = 0; i < reps; i++) {
90            generatedField.setFloat(view, 0.1f);
91        }
92    }
93
94    static class View {
95        float x;
96
97        public void setX(float x) {
98            this.x = x;
99        }
100    }
101
102    static interface GeneratedProperty {
103        void setFloat(View v, float f);
104    }
105
106    static class GeneratedSetter implements GeneratedProperty {
107        public void setFloat(View v, float f) {
108            v.setX(f);
109        }
110    }
111
112    static class GeneratedField implements GeneratedProperty {
113        public void setFloat(View v, float f) {
114            v.x = f;
115        }
116    }
117}
118