Add test for invoke-interface performance with IMT
This test examines performance of invoke-interfaces when the
InterfaceMethodTable has collisions.
Bug: 27556801
Change-Id: I988ce5f2cdfb581d8e6be5e17b2f94c5b6cdd01a
diff --git a/benchmarks/src/benchmarks/InvokeInterface.java b/benchmarks/src/benchmarks/InvokeInterface.java
new file mode 100644
index 0000000..a9c3c28
--- /dev/null
+++ b/benchmarks/src/benchmarks/InvokeInterface.java
@@ -0,0 +1,641 @@
+/*
+ * Copyright 2016 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;
+
+public class InvokeInterface {
+ static MultiClass multi;
+
+ static {
+ multi = new MultiClass();
+ }
+
+ public void timeCall0Concrete(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall0Concrete(m);
+ }
+ }
+
+ public void timeCall0Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall0Interface(m);
+ }
+ }
+
+ public void timeCall1Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall1Interface(m);
+ }
+ }
+
+ public void timeCall2Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall2Interface(m);
+ }
+ }
+
+ public void timeCall3Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall3Interface(m);
+ }
+ }
+
+ public void timeCall4Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall4Interface(m);
+ }
+ }
+
+ public void timeCall5Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall5Interface(m);
+ }
+ }
+
+ public void timeCall6Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall6Interface(m);
+ }
+ }
+
+ public void timeCall7Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall7Interface(m);
+ }
+ }
+
+ public void timeCall8Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall8Interface(m);
+ }
+ }
+
+ public void timeCall9Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall9Interface(m);
+ }
+ }
+
+ public void timeCall10Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall10Interface(m);
+ }
+ }
+
+ public void timeCall11Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall11Interface(m);
+ }
+ }
+
+ public void timeCall12Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall12Interface(m);
+ }
+ }
+
+ public void timeCall13Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall13Interface(m);
+ }
+ }
+
+ public void timeCall14Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall14Interface(m);
+ }
+ }
+
+ public void timeCall15Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall15Interface(m);
+ }
+ }
+
+ public void timeCall16Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall16Interface(m);
+ }
+ }
+
+ public void timeCall17Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall17Interface(m);
+ }
+ }
+
+ public void timeCall18Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall18Interface(m);
+ }
+ }
+
+ public void timeCall19Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall19Interface(m);
+ }
+ }
+
+ public void timeCall20Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall20Interface(m);
+ }
+ }
+
+ public void timeCall21Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall21Interface(m);
+ }
+ }
+
+ public void timeCall22Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall22Interface(m);
+ }
+ }
+
+ public void timeCall23Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall23Interface(m);
+ }
+ }
+
+ public void timeCall24Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall24Interface(m);
+ }
+ }
+
+ public void timeCall25Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall25Interface(m);
+ }
+ }
+
+ public void timeCall26Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall26Interface(m);
+ }
+ }
+
+ public void timeCall27Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall27Interface(m);
+ }
+ }
+
+ public void timeCall28Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall28Interface(m);
+ }
+ }
+
+ public void timeCall29Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall29Interface(m);
+ }
+ }
+
+ public void timeCall30Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall30Interface(m);
+ }
+ }
+
+ public void timeCall31Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall31Interface(m);
+ }
+ }
+
+ public void timeCall32Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall32Interface(m);
+ }
+ }
+
+ public void timeCall33Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall33Interface(m);
+ }
+ }
+
+ public void timeCall34Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall34Interface(m);
+ }
+ }
+
+ public void timeCall35Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall35Interface(m);
+ }
+ }
+
+ public void timeCall36Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall36Interface(m);
+ }
+ }
+
+ public void timeCall37Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall37Interface(m);
+ }
+ }
+
+ public void timeCall38Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall38Interface(m);
+ }
+ }
+
+ public void timeCall39Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall39Interface(m);
+ }
+ }
+
+ public void timeCall40Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall40Interface(m);
+ }
+ }
+
+ public void timeCall41Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall41Interface(m);
+ }
+ }
+
+ public void timeCall42Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall42Interface(m);
+ }
+ }
+
+ public void timeCall43Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall43Interface(m);
+ }
+ }
+
+ public void timeCall44Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall44Interface(m);
+ }
+ }
+
+ public void timeCall45Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall45Interface(m);
+ }
+ }
+
+ public void timeCall46Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall46Interface(m);
+ }
+ }
+
+ public void timeCall47Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall47Interface(m);
+ }
+ }
+
+ public void timeCall48Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall48Interface(m);
+ }
+ }
+
+ public void timeCall49Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall49Interface(m);
+ }
+ }
+
+ public void timeCall50Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall50Interface(m);
+ }
+ }
+
+ public void timeCall51Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall51Interface(m);
+ }
+ }
+
+ public void timeCall52Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall52Interface(m);
+ }
+ }
+
+ public void timeCall53Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall53Interface(m);
+ }
+ }
+
+ public void timeCall54Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall54Interface(m);
+ }
+ }
+
+ public void timeCall55Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall55Interface(m);
+ }
+ }
+
+ public void timeCall56Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall56Interface(m);
+ }
+ }
+
+ public void timeCall57Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall57Interface(m);
+ }
+ }
+
+ public void timeCall58Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall58Interface(m);
+ }
+ }
+
+ public void timeCall59Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall59Interface(m);
+ }
+ }
+
+ public void timeCall60Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall60Interface(m);
+ }
+ }
+
+ public void timeCall61Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall61Interface(m);
+ }
+ }
+
+ public void timeCall62Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall62Interface(m);
+ }
+ }
+
+ public void timeCall63Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall63Interface(m);
+ }
+ }
+
+ public void timeCall64Interface(int nreps) {
+ MultiClass m = multi;
+ for (int i = 0; i < nreps; i++) {
+ doCall64Interface(m);
+ }
+ }
+
+ // Try calling these through the IMT/IfTable
+ public void doCall0Interface(Iface0 i) { i.callIface0(); }
+ public void doCall1Interface(Iface1 i) { i.callIface1(); }
+ public void doCall2Interface(Iface2 i) { i.callIface2(); }
+ public void doCall3Interface(Iface3 i) { i.callIface3(); }
+ public void doCall4Interface(Iface4 i) { i.callIface4(); }
+ public void doCall5Interface(Iface5 i) { i.callIface5(); }
+ public void doCall6Interface(Iface6 i) { i.callIface6(); }
+ public void doCall7Interface(Iface7 i) { i.callIface7(); }
+ public void doCall8Interface(Iface8 i) { i.callIface8(); }
+ public void doCall9Interface(Iface9 i) { i.callIface9(); }
+ public void doCall10Interface(Iface10 i) { i.callIface10(); }
+ public void doCall11Interface(Iface11 i) { i.callIface11(); }
+ public void doCall12Interface(Iface12 i) { i.callIface12(); }
+ public void doCall13Interface(Iface13 i) { i.callIface13(); }
+ public void doCall14Interface(Iface14 i) { i.callIface14(); }
+ public void doCall15Interface(Iface15 i) { i.callIface15(); }
+ public void doCall16Interface(Iface16 i) { i.callIface16(); }
+ public void doCall17Interface(Iface17 i) { i.callIface17(); }
+ public void doCall18Interface(Iface18 i) { i.callIface18(); }
+ public void doCall19Interface(Iface19 i) { i.callIface19(); }
+ public void doCall20Interface(Iface20 i) { i.callIface20(); }
+ public void doCall21Interface(Iface21 i) { i.callIface21(); }
+ public void doCall22Interface(Iface22 i) { i.callIface22(); }
+ public void doCall23Interface(Iface23 i) { i.callIface23(); }
+ public void doCall24Interface(Iface24 i) { i.callIface24(); }
+ public void doCall25Interface(Iface25 i) { i.callIface25(); }
+ public void doCall26Interface(Iface26 i) { i.callIface26(); }
+ public void doCall27Interface(Iface27 i) { i.callIface27(); }
+ public void doCall28Interface(Iface28 i) { i.callIface28(); }
+ public void doCall29Interface(Iface29 i) { i.callIface29(); }
+ public void doCall30Interface(Iface30 i) { i.callIface30(); }
+ public void doCall31Interface(Iface31 i) { i.callIface31(); }
+ public void doCall32Interface(Iface32 i) { i.callIface32(); }
+ public void doCall33Interface(Iface33 i) { i.callIface33(); }
+ public void doCall34Interface(Iface34 i) { i.callIface34(); }
+ public void doCall35Interface(Iface35 i) { i.callIface35(); }
+ public void doCall36Interface(Iface36 i) { i.callIface36(); }
+ public void doCall37Interface(Iface37 i) { i.callIface37(); }
+ public void doCall38Interface(Iface38 i) { i.callIface38(); }
+ public void doCall39Interface(Iface39 i) { i.callIface39(); }
+ public void doCall40Interface(Iface40 i) { i.callIface40(); }
+ public void doCall41Interface(Iface41 i) { i.callIface41(); }
+ public void doCall42Interface(Iface42 i) { i.callIface42(); }
+ public void doCall43Interface(Iface43 i) { i.callIface43(); }
+ public void doCall44Interface(Iface44 i) { i.callIface44(); }
+ public void doCall45Interface(Iface45 i) { i.callIface45(); }
+ public void doCall46Interface(Iface46 i) { i.callIface46(); }
+ public void doCall47Interface(Iface47 i) { i.callIface47(); }
+ public void doCall48Interface(Iface48 i) { i.callIface48(); }
+ public void doCall49Interface(Iface49 i) { i.callIface49(); }
+ public void doCall50Interface(Iface50 i) { i.callIface50(); }
+ public void doCall51Interface(Iface51 i) { i.callIface51(); }
+ public void doCall52Interface(Iface52 i) { i.callIface52(); }
+ public void doCall53Interface(Iface53 i) { i.callIface53(); }
+ public void doCall54Interface(Iface54 i) { i.callIface54(); }
+ public void doCall55Interface(Iface55 i) { i.callIface55(); }
+ public void doCall56Interface(Iface56 i) { i.callIface56(); }
+ public void doCall57Interface(Iface57 i) { i.callIface57(); }
+ public void doCall58Interface(Iface58 i) { i.callIface58(); }
+ public void doCall59Interface(Iface59 i) { i.callIface59(); }
+ public void doCall60Interface(Iface60 i) { i.callIface60(); }
+ public void doCall61Interface(Iface61 i) { i.callIface61(); }
+ public void doCall62Interface(Iface62 i) { i.callIface62(); }
+ public void doCall63Interface(Iface63 i) { i.callIface63(); }
+ public void doCall64Interface(Iface64 i) { i.callIface64(); }
+
+ // Try calling this through the vtable for comparison.
+ public void doCall0Concrete(MultiClass m) { m.callIface0(); }
+
+ // IMTs are 64 entries in length. By making this 65 interfaces we guarantee that we will have a
+ // collision.
+ static class MultiClass implements Iface0, Iface1, Iface2, Iface3, Iface4,
+ Iface5, Iface6, Iface7, Iface8, Iface9,
+ Iface10, Iface11, Iface12, Iface13, Iface14,
+ Iface15, Iface16, Iface17, Iface18, Iface19,
+ Iface20, Iface21, Iface22, Iface23, Iface24,
+ Iface25, Iface26, Iface27, Iface28, Iface29,
+ Iface30, Iface31, Iface32, Iface33, Iface34,
+ Iface35, Iface36, Iface37, Iface38, Iface39,
+ Iface40, Iface41, Iface42, Iface43, Iface44,
+ Iface45, Iface46, Iface47, Iface48, Iface49,
+ Iface50, Iface51, Iface52, Iface53, Iface54,
+ Iface55, Iface56, Iface57, Iface58, Iface59,
+ Iface60, Iface61, Iface62, Iface63, Iface64 { }
+
+ // The declaration of the 64 interfaces. We give them all default methods to avoid having to
+ // repeat ourselves.
+ static interface Iface0 { default void callIface0() {} }
+ static interface Iface1 { default void callIface1() {} }
+ static interface Iface2 { default void callIface2() {} }
+ static interface Iface3 { default void callIface3() {} }
+ static interface Iface4 { default void callIface4() {} }
+ static interface Iface5 { default void callIface5() {} }
+ static interface Iface6 { default void callIface6() {} }
+ static interface Iface7 { default void callIface7() {} }
+ static interface Iface8 { default void callIface8() {} }
+ static interface Iface9 { default void callIface9() {} }
+ static interface Iface10 { default void callIface10() {} }
+ static interface Iface11 { default void callIface11() {} }
+ static interface Iface12 { default void callIface12() {} }
+ static interface Iface13 { default void callIface13() {} }
+ static interface Iface14 { default void callIface14() {} }
+ static interface Iface15 { default void callIface15() {} }
+ static interface Iface16 { default void callIface16() {} }
+ static interface Iface17 { default void callIface17() {} }
+ static interface Iface18 { default void callIface18() {} }
+ static interface Iface19 { default void callIface19() {} }
+ static interface Iface20 { default void callIface20() {} }
+ static interface Iface21 { default void callIface21() {} }
+ static interface Iface22 { default void callIface22() {} }
+ static interface Iface23 { default void callIface23() {} }
+ static interface Iface24 { default void callIface24() {} }
+ static interface Iface25 { default void callIface25() {} }
+ static interface Iface26 { default void callIface26() {} }
+ static interface Iface27 { default void callIface27() {} }
+ static interface Iface28 { default void callIface28() {} }
+ static interface Iface29 { default void callIface29() {} }
+ static interface Iface30 { default void callIface30() {} }
+ static interface Iface31 { default void callIface31() {} }
+ static interface Iface32 { default void callIface32() {} }
+ static interface Iface33 { default void callIface33() {} }
+ static interface Iface34 { default void callIface34() {} }
+ static interface Iface35 { default void callIface35() {} }
+ static interface Iface36 { default void callIface36() {} }
+ static interface Iface37 { default void callIface37() {} }
+ static interface Iface38 { default void callIface38() {} }
+ static interface Iface39 { default void callIface39() {} }
+ static interface Iface40 { default void callIface40() {} }
+ static interface Iface41 { default void callIface41() {} }
+ static interface Iface42 { default void callIface42() {} }
+ static interface Iface43 { default void callIface43() {} }
+ static interface Iface44 { default void callIface44() {} }
+ static interface Iface45 { default void callIface45() {} }
+ static interface Iface46 { default void callIface46() {} }
+ static interface Iface47 { default void callIface47() {} }
+ static interface Iface48 { default void callIface48() {} }
+ static interface Iface49 { default void callIface49() {} }
+ static interface Iface50 { default void callIface50() {} }
+ static interface Iface51 { default void callIface51() {} }
+ static interface Iface52 { default void callIface52() {} }
+ static interface Iface53 { default void callIface53() {} }
+ static interface Iface54 { default void callIface54() {} }
+ static interface Iface55 { default void callIface55() {} }
+ static interface Iface56 { default void callIface56() {} }
+ static interface Iface57 { default void callIface57() {} }
+ static interface Iface58 { default void callIface58() {} }
+ static interface Iface59 { default void callIface59() {} }
+ static interface Iface60 { default void callIface60() {} }
+ static interface Iface61 { default void callIface61() {} }
+ static interface Iface62 { default void callIface62() {} }
+ static interface Iface63 { default void callIface63() {} }
+ static interface Iface64 { default void callIface64() {} }
+}