1 /* 2 * Copyright (C) 2007 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 17 /* 18 Initial: 19 test001: 2039901us (4079ns per call) 20 test049: 3346619us (6693ns per call) 21 test099: 4687402us (9374ns per call) 22 testInst001: 1327216us (2654ns per use) 23 testInst049: 1326995us (2653ns per use) 24 testInst099: 1327735us (2655ns per use) 25 26 After refactoring cache code: 2871ns per use 27 After re-refactoring cache code: 2797ns per use 28 29 After de-inlining invoke-interface: 30 test001: 2164873us (4329ns per call) 31 test049: 3303884us (6607ns per call) 32 test099: 4656718us (9313ns per call) 33 testInst001: 1401731us (2803ns per use) 34 testInst049: 1401120us (2802ns per use) 35 testInst099: 1401298us (2802ns per use) 36 37 After adding caching for invoke-interface: 38 testIface001: 1909330us (3818ns per call) 39 testIface049: 1905204us (3810ns per call) 40 testIface099: 1899012us (3798ns per call) 41 testVirt001: 1825001us (3650ns per call) 42 testVirt049: 1826161us (3652ns per call) 43 testVirt099: 1823915us (3647ns per call) 44 testInst001: 1393963us (2787ns per use) 45 testInst049: 1393163us (2786ns per use) 46 testInst099: 1390496us (2780ns per use) 47 48 After repeating each operation 16 times inside the inner loop: 49 testIface001: 1429472us (2726ns per call) * 2382ns 50 testIface049: 1427847us (2723ns per call) * 2396ns 51 testIface099: 1423707us (2715ns per call) * 2387ns 52 testVirt001: 1277790us (2437ns per call) * 2118ns 53 testVirt049: 1280276us (2441ns per call) * 2119ns 54 testVirt099: 1272640us (2427ns per call) * 2118ns 55 testInst001: 844694us (1611ns per use) * 1396ns 56 testInst049: 845619us (1612ns per use) * 1395ns 57 testInst099: 845526us (1612ns per use) * 1394ns 58 ('*' is with dx optimizations enabled) 59 */ 60 61 /** 62 * Semi-generated class with many interfaces. 63 */ 64 public class ManyInterfaces 65 implements 66 Interface000, 67 Interface001, 68 Interface002, 69 Interface003, 70 Interface004, 71 Interface005, 72 Interface006, 73 Interface007, 74 Interface008, 75 Interface009, 76 Interface010, 77 Interface011, 78 Interface012, 79 Interface013, 80 Interface014, 81 Interface015, 82 Interface016, 83 Interface017, 84 Interface018, 85 Interface019, 86 Interface020, 87 Interface021, 88 Interface022, 89 Interface023, 90 Interface024, 91 Interface025, 92 Interface026, 93 Interface027, 94 Interface028, 95 Interface029, 96 Interface030, 97 Interface031, 98 Interface032, 99 Interface033, 100 Interface034, 101 Interface035, 102 Interface036, 103 Interface037, 104 Interface038, 105 Interface039, 106 Interface040, 107 Interface041, 108 Interface042, 109 Interface043, 110 Interface044, 111 Interface045, 112 Interface046, 113 Interface047, 114 Interface048, 115 Interface049, 116 Interface050, 117 Interface051, 118 Interface052, 119 Interface053, 120 Interface054, 121 Interface055, 122 Interface056, 123 Interface057, 124 Interface058, 125 Interface059, 126 Interface060, 127 Interface061, 128 Interface062, 129 Interface063, 130 Interface064, 131 Interface065, 132 Interface066, 133 Interface067, 134 Interface068, 135 Interface069, 136 Interface070, 137 Interface071, 138 Interface072, 139 Interface073, 140 Interface074, 141 Interface075, 142 Interface076, 143 Interface077, 144 Interface078, 145 Interface079, 146 Interface080, 147 Interface081, 148 Interface082, 149 Interface083, 150 Interface084, 151 Interface085, 152 Interface086, 153 Interface087, 154 Interface088, 155 Interface089, 156 Interface090, 157 Interface091, 158 Interface092, 159 Interface093, 160 Interface094, 161 Interface095, 162 Interface096, 163 Interface097, 164 Interface098, 165 Interface099 166 { 167 /** whether to report timing information */ 168 private static boolean timing = false; 169 170 /** 171 * Report on a section. 172 */ report(String label, long start, long end, int iter, int rept)173 private static void report(String label, long start, long end, int iter, 174 int rept) { 175 if (timing) { 176 System.out.println(label + ": " + (end - start) / 1000 + "us" 177 + " (" + (end - start) / (iter*rept) + "ns per call)"); 178 } else { 179 System.out.println(label + ": done"); 180 } 181 } 182 183 /** 184 * Run tests. 185 * 186 * @param timing whether to print out timing info 187 */ run(boolean timing)188 public static void run(boolean timing) { 189 ManyInterfaces.timing = timing; 190 ManyInterfaces obj = new ManyInterfaces(); 191 Interface001 one; 192 Interface049 forty; 193 Interface099 ninety; 194 long start, end; 195 int iter = 32768; 196 int rept = 16; 197 int i; 198 199 /* 200 * Clear the heap. The various classes involved should already 201 * be loaded and ready as a result of instantiating ManyInterfaces. 202 */ 203 Runtime.getRuntime().gc(); 204 205 start = System.nanoTime(); 206 testIface001(obj, iter); 207 end = System.nanoTime(); 208 report("testIface001", start, end, iter, rept); 209 210 start = System.nanoTime(); 211 testIface049(obj, iter); 212 end = System.nanoTime(); 213 report("testIface049", start, end, iter, rept); 214 215 start = System.nanoTime(); 216 testIface099(obj, iter); 217 end = System.nanoTime(); 218 report("testIface099", start, end, iter, rept); 219 220 start = System.nanoTime(); 221 testVirt001(obj, iter); 222 end = System.nanoTime(); 223 report("testVirt001", start, end, iter, rept); 224 225 start = System.nanoTime(); 226 testVirt049(obj, iter); 227 end = System.nanoTime(); 228 report("testVirt049", start, end, iter, rept); 229 230 start = System.nanoTime(); 231 testVirt099(obj, iter); 232 end = System.nanoTime(); 233 report("testVirt099", start, end, iter, rept); 234 235 start = System.nanoTime(); 236 testInstance001(obj, iter); 237 end = System.nanoTime(); 238 report("testInst001", start, end, iter, rept); 239 240 start = System.nanoTime(); 241 testInstance049(obj, iter); 242 end = System.nanoTime(); 243 report("testInst049", start, end, iter, rept); 244 245 start = System.nanoTime(); 246 testInstance099(obj, iter); 247 end = System.nanoTime(); 248 report("testInst099", start, end, iter, rept); 249 } 250 func001()251 public int func001() { return 1; } func003()252 public int func003() { return 3; } func005()253 public int func005() { return 5; } func007()254 public int func007() { return 7; } func009()255 public int func009() { return 9; } func011()256 public int func011() { return 11; } func013()257 public int func013() { return 13; } func015()258 public int func015() { return 15; } func017()259 public int func017() { return 17; } func019()260 public int func019() { return 19; } func021()261 public int func021() { return 21; } func023()262 public int func023() { return 23; } func025()263 public int func025() { return 25; } func027()264 public int func027() { return 27; } func029()265 public int func029() { return 29; } func031()266 public int func031() { return 31; } func033()267 public int func033() { return 33; } func035()268 public int func035() { return 35; } func037()269 public int func037() { return 37; } func039()270 public int func039() { return 39; } func041()271 public int func041() { return 41; } func043()272 public int func043() { return 43; } func045()273 public int func045() { return 45; } func047()274 public int func047() { return 47; } func049()275 public int func049() { return 49; } func051()276 public int func051() { return 51; } func053()277 public int func053() { return 53; } func055()278 public int func055() { return 55; } func057()279 public int func057() { return 57; } func059()280 public int func059() { return 59; } func061()281 public int func061() { return 61; } func063()282 public int func063() { return 63; } func065()283 public int func065() { return 65; } func067()284 public int func067() { return 67; } func069()285 public int func069() { return 69; } func071()286 public int func071() { return 71; } func073()287 public int func073() { return 73; } func075()288 public int func075() { return 75; } func077()289 public int func077() { return 77; } func079()290 public int func079() { return 79; } func081()291 public int func081() { return 81; } func083()292 public int func083() { return 83; } func085()293 public int func085() { return 85; } func087()294 public int func087() { return 87; } func089()295 public int func089() { return 89; } func091()296 public int func091() { return 91; } func093()297 public int func093() { return 93; } func095()298 public int func095() { return 95; } func097()299 public int func097() { return 97; } func099()300 public int func099() { return 99; } 301 testIface001(Interface001 iface, int count)302 static void testIface001(Interface001 iface, int count) { 303 while (count-- != 0) { 304 iface.func001(); iface.func001(); iface.func001(); iface.func001(); 305 iface.func001(); iface.func001(); iface.func001(); iface.func001(); 306 iface.func001(); iface.func001(); iface.func001(); iface.func001(); 307 iface.func001(); iface.func001(); iface.func001(); iface.func001(); 308 } 309 } 310 testIface049(Interface049 iface, int count)311 static void testIface049(Interface049 iface, int count) { 312 while (count-- != 0) { 313 iface.func049(); iface.func049(); iface.func049(); iface.func049(); 314 iface.func049(); iface.func049(); iface.func049(); iface.func049(); 315 iface.func049(); iface.func049(); iface.func049(); iface.func049(); 316 iface.func049(); iface.func049(); iface.func049(); iface.func049(); 317 } 318 } 319 testIface099(Interface099 iface, int count)320 static void testIface099(Interface099 iface, int count) { 321 while (count-- != 0) { 322 iface.func099(); iface.func099(); iface.func099(); iface.func099(); 323 iface.func099(); iface.func099(); iface.func099(); iface.func099(); 324 iface.func099(); iface.func099(); iface.func099(); iface.func099(); 325 iface.func099(); iface.func099(); iface.func099(); iface.func099(); 326 } 327 } 328 testVirt001(ManyInterfaces obj, int count)329 static void testVirt001(ManyInterfaces obj, int count) { 330 while (count-- != 0) { 331 obj.func001(); obj.func001(); obj.func001(); obj.func001(); 332 obj.func001(); obj.func001(); obj.func001(); obj.func001(); 333 obj.func001(); obj.func001(); obj.func001(); obj.func001(); 334 obj.func001(); obj.func001(); obj.func001(); obj.func001(); 335 } 336 } 337 testVirt049(ManyInterfaces obj, int count)338 static void testVirt049(ManyInterfaces obj, int count) { 339 while (count-- != 0) { 340 obj.func049(); obj.func049(); obj.func049(); obj.func049(); 341 obj.func049(); obj.func049(); obj.func049(); obj.func049(); 342 obj.func049(); obj.func049(); obj.func049(); obj.func049(); 343 obj.func049(); obj.func049(); obj.func049(); obj.func049(); 344 } 345 } 346 testVirt099(ManyInterfaces obj, int count)347 static void testVirt099(ManyInterfaces obj, int count) { 348 while (count-- != 0) { 349 obj.func099(); obj.func099(); obj.func099(); obj.func099(); 350 obj.func099(); obj.func099(); obj.func099(); obj.func099(); 351 obj.func099(); obj.func099(); obj.func099(); obj.func099(); 352 obj.func099(); obj.func099(); obj.func099(); obj.func099(); 353 } 354 } 355 testInstance001(Object obj, int count)356 static void testInstance001(Object obj, int count) { 357 if (!(obj instanceof Interface001)) 358 System.out.println("BAD"); 359 while (count-- != 0) { 360 boolean is; 361 is = obj instanceof Interface001; 362 is = obj instanceof Interface001; 363 is = obj instanceof Interface001; 364 is = obj instanceof Interface001; 365 is = obj instanceof Interface001; 366 is = obj instanceof Interface001; 367 is = obj instanceof Interface001; 368 is = obj instanceof Interface001; 369 is = obj instanceof Interface001; 370 is = obj instanceof Interface001; 371 is = obj instanceof Interface001; 372 is = obj instanceof Interface001; 373 is = obj instanceof Interface001; 374 is = obj instanceof Interface001; 375 is = obj instanceof Interface001; 376 is = obj instanceof Interface001; 377 } 378 } 379 testInstance049(Object obj, int count)380 static void testInstance049(Object obj, int count) { 381 if (!(obj instanceof Interface049)) 382 System.out.println("BAD"); 383 while (count-- != 0) { 384 boolean is; 385 is = obj instanceof Interface049; 386 is = obj instanceof Interface049; 387 is = obj instanceof Interface049; 388 is = obj instanceof Interface049; 389 is = obj instanceof Interface049; 390 is = obj instanceof Interface049; 391 is = obj instanceof Interface049; 392 is = obj instanceof Interface049; 393 is = obj instanceof Interface049; 394 is = obj instanceof Interface049; 395 is = obj instanceof Interface049; 396 is = obj instanceof Interface049; 397 is = obj instanceof Interface049; 398 is = obj instanceof Interface049; 399 is = obj instanceof Interface049; 400 is = obj instanceof Interface049; 401 } 402 } 403 testInstance099(Object obj, int count)404 static void testInstance099(Object obj, int count) { 405 if (!(obj instanceof Interface099)) 406 System.out.println("BAD"); 407 while (count-- != 0) { 408 boolean is; 409 is = obj instanceof Interface099; 410 is = obj instanceof Interface099; 411 is = obj instanceof Interface099; 412 is = obj instanceof Interface099; 413 is = obj instanceof Interface099; 414 is = obj instanceof Interface099; 415 is = obj instanceof Interface099; 416 is = obj instanceof Interface099; 417 is = obj instanceof Interface099; 418 is = obj instanceof Interface099; 419 is = obj instanceof Interface099; 420 is = obj instanceof Interface099; 421 is = obj instanceof Interface099; 422 is = obj instanceof Interface099; 423 is = obj instanceof Interface099; 424 is = obj instanceof Interface099; 425 } 426 } 427 } 428