1/*
2 * Copyright (C) 2010 Google Inc.
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;
18
19import com.google.caliper.Param;
20import com.google.caliper.Runner;
21import com.google.caliper.SimpleBenchmark;
22
23/**
24 * Compares various kinds of method invocation.
25 */
26public class MethodInvocationBenchmark extends SimpleBenchmark {
27    interface I {
28        void emptyInterface();
29    }
30
31    static class C implements I {
32        private int field;
33
34        private int getField() {
35            return field;
36        }
37
38        public int timeInternalGetter(int reps) {
39            int result = 0;
40            for (int i = 0; i < reps; ++i) {
41                result = getField();
42            }
43            return result;
44        }
45
46        public int timeInternalFieldAccess(int reps) {
47            int result = 0;
48            for (int i = 0; i < reps; ++i) {
49                result = field;
50            }
51            return result;
52        }
53
54        public static void emptyStatic() {
55        }
56
57        public void emptyVirtual() {
58        }
59
60        public void emptyInterface() {
61        }
62    }
63
64    public void timeInternalGetter(int reps) {
65        new C().timeInternalGetter(reps);
66    }
67
68    public void timeInternalFieldAccess(int reps) {
69        new C().timeInternalFieldAccess(reps);
70    }
71
72    // Test an intrinsic.
73    public int timeStringLength(int reps) {
74        int result = 0;
75        for (int i = 0; i < reps; ++i) {
76            result = "hello, world!".length();
77        }
78        return result;
79    }
80
81    public void timeEmptyStatic(int reps) {
82        C c = new C();
83        for (int i = 0; i < reps; ++i) {
84            c.emptyStatic();
85        }
86    }
87
88    public void timeEmptyVirtual(int reps) {
89        C c = new C();
90        for (int i = 0; i < reps; ++i) {
91            c.emptyVirtual();
92        }
93    }
94
95    public void timeEmptyInterface(int reps) {
96        I c = new C();
97        for (int i = 0; i < reps; ++i) {
98            c.emptyInterface();
99        }
100    }
101
102    public static class Inner {
103        private int i;
104        private void privateMethod() { ++i; }
105        protected void protectedMethod() { ++i; }
106        public void publicMethod() { ++i; }
107        void packageMethod() { ++i; }
108        final void finalPackageMethod() { ++i; }
109    }
110
111    public void timePrivateInnerPublicMethod(int reps) {
112        Inner inner = new Inner();
113        for (int i = 0; i < reps; ++i) {
114            inner.publicMethod();
115        }
116    }
117
118    public void timePrivateInnerProtectedMethod(int reps) {
119        Inner inner = new Inner();
120        for (int i = 0; i < reps; ++i) {
121            inner.protectedMethod();
122        }
123    }
124
125    public void timePrivateInnerPrivateMethod(int reps) {
126        Inner inner = new Inner();
127        for (int i = 0; i < reps; ++i) {
128            inner.privateMethod();
129        }
130    }
131
132    public void timePrivateInnerPackageMethod(int reps) {
133        Inner inner = new Inner();
134        for (int i = 0; i < reps; ++i) {
135            inner.packageMethod();
136        }
137    }
138
139    public void timePrivateInnerFinalPackageMethod(int reps) {
140        Inner inner = new Inner();
141        for (int i = 0; i < reps; ++i) {
142          inner.finalPackageMethod();
143        }
144    }
145}
146