/* * Copyright 2009-2016 Tilmann Zaeschke. All rights reserved. * * This file is part of ZooDB. * * ZooDB is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * ZooDB is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with ZooDB. If not, see <http://www.gnu.org/licenses/>. * * See the README and COPYING files for further information. */ package org.zoodb.test.java; import java.lang.reflect.Field; public class PerfReflection { //private static final long MAX = 10000000; private static final long MAX = 1000000; private long timer = 0; private static interface I1 { int getX(); } private static interface I2 { int getX(); } private static interface I3 { int getX(); } private static interface I4 { int getX(); } private static class Cls1 implements I1, I2, I3, I4 { private int x1; public int getX() { return x1; } } private static class Cls2 implements I2, I3, I4 { private int x2; public int getX() { return x2; } } private static class Cls3 implements I3, I4 { private int x3; public int getX() { return x3; } } private static class Cls4 implements I4 { private int x4; public int getX() { return x4; } } private static class Cls12 extends Cls1 implements I2, I3, I4 { private int x2; public int getX() { return x2; } } private static class Cls23 extends Cls12 implements I3, I4 { private int x3; public int getX() { return x3; } } private static class Cls34 extends Cls23 implements I4 { private int x4; public int getX() { return x4; } } public static void main(String[] args) { try { new PerfReflection().testPolyMorphArry(); } catch (IllegalArgumentException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } } public void testPolyMorphArry() throws IllegalArgumentException, IllegalAccessException { Field f1, f2, f3, f4; try { f1 = Cls1.class.getDeclaredField("x1"); f1.setAccessible(true); f2 = Cls2.class.getDeclaredField("x2"); f2.setAccessible(true); f3 = Cls3.class.getDeclaredField("x3"); f3.setAccessible(true); f4 = Cls4.class.getDeclaredField("x4"); f4.setAccessible(true); } catch (NoSuchFieldException e) { throw new RuntimeException(e); } catch (SecurityException e) { throw new RuntimeException(e); } int N = (int) MAX; Cls1 o11 = new Cls1(), o12 = new Cls1(), o13 = new Cls1(), o14 = new Cls1(); Cls2 o21 = new Cls2(), o22 = new Cls2(); Cls3 o3 = new Cls3(); Cls4 o4 = new Cls4(); Cls1[] a0 = new Cls1[N]; I1[] a1 = new I1[N]; I2[] a2 = new I2[N]; I3[] a3 = new I3[N]; I4[] a4 = new I4[N]; //Always use four objects to reduce cache skew (less objects in cache) Cls1[] c = {o11, o12, o13, o14}; //o1 I1[] x1 = {o11, o12, o13, o14}; //o1 I2[] x2 = {o11, o21, o12, o22}; //o2, o2 I3[] x3 = {o11, o21, o3, o12}; //o1, o2, o3 I4[] x4 = {o11, o21, o3, o4}; //o1, o2, o3, o4 //inheritance tests Cls12 c21 = new Cls12(), c22 = new Cls12(); Cls23 c3 = new Cls23(); Cls34 c4 = new Cls34(); Cls1[] x01 = {o11, c21, c3, c4}; Cls34[] x34 = {c4, c4, c4, c4}; Cls1[] a01 = new Cls1[N]; Cls34[] a34 = new Cls34[N]; for (int i = 0; i < N; i++) { int ii = i%4; a0[i] = c[ii]; a1[i] = x1[ii]; a2[i] = x2[ii]; a3[i] = x3[ii]; a4[i] = x4[ii]; a01[i] = x01[ii]; a34[i] = x34[ii]; } long n = 0; for (int i = 0; i < 10; i++) { start(); for (int k = 0; k < 10; k++) for (int j = 0; j < MAX; j++) { n+= a0[j].getX(); } stop("Class"); start(); for (int k = 0; k < 10; k++) for (int j = 0; j < MAX; j++) { n+= a1[j].getX(); } stop("IF 1 impl"); start(); for (int k = 0; k < 10; k++) for (int j = 0; j < MAX; j++) { n+= f1.getInt(a01[j]); } stop("CC 1 refl"); start(); for (int k = 0; k < 10; k++) for (int j = 0; j < MAX; j++) { n+= a2[j].getX(); } stop("IF 2 impl"); start(); for (int k = 0; k < 10; k++) for (int j = 0; j < MAX; j++) { n+= a3[j].getX(); } stop("IF 3 impl"); start(); for (int k = 0; k < 10; k++) for (int j = 0; j < MAX; j++) { n+= a4[j].getX(); } stop("IF 4 impl"); start(); for (int k = 0; k < 10; k++) for (int j = 0; j < MAX; j++) { n+= f1.getInt(a34[j]); } stop("CC 4 refl"); } System.out.println("n=" + n); } private void start() { timer = System.currentTimeMillis(); } private void stop(String str) { long t = System.currentTimeMillis() - timer; System.out.println(str + ": " + t); } }