109940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath/* 209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * Copyright (C) 2013 The Android Open Source Project 309940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * 409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * Licensed under the Apache License, Version 2.0 (the "License"); 509940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * you may not use this file except in compliance with the License. 609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * You may obtain a copy of the License at 709940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * 809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * http://www.apache.org/licenses/LICENSE-2.0 909940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * 1009940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * Unless required by applicable law or agreed to in writing, software 1109940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * distributed under the License is distributed on an "AS IS" BASIS, 1209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1309940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * See the License for the specific language governing permissions and 1409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * limitations under the License 1509940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath */ 1609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 1709940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamathpackage benchmarks; 1809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 1909940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamathimport com.google.caliper.Param; 2009940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamathimport java.lang.reflect.Array; 2109940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamathimport java.lang.reflect.Constructor; 2209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamathimport java.util.Arrays; 2309940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 24ea13f8291a92b6f47f50011da1d5e8c107984bc3Paul Duffinpublic class DeepArrayOpsBenchmark { 2509940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath @Param({"1", "4", "16", "256", "2048"}) int arrayLength; 2609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 2709940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath private Object[] array; 2809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath private Object[] array2; 2909940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 3009940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath private Object[] array3; 3109940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath private Object[] array4; 3209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 3309940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath protected void setUp() throws Exception { 3409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array = new Object[arrayLength * 13]; 3509940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array2 = new Object[arrayLength * 13]; 3609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath for (int i = 0; i < arrayLength; i += 13) { 3709940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array[i] = new IntWrapper(i); 3809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array2[i] = new IntWrapper(i); 3909940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 4009940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array[i + 1] = new16ElementObjectarray(); 4109940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array2[i + 1] = new16ElementObjectarray(); 4209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 4309940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array[i + 2] = new boolean[16]; 4409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array2[i + 2] = new boolean[16]; 4509940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 4609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array[i + 3] = new byte[16]; 4709940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array2[i + 3] = new byte[16]; 4809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 4909940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array[i + 4] = new char[16]; 5009940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array2[i + 4] = new char[16]; 5109940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 5209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array[i + 5] = new short[16]; 5309940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array2[i + 5] = new short[16]; 5409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 5509940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array[i + 6] = new float[16]; 5609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array2[i + 6] = new float[16]; 5709940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 5809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array[i + 7] = new long[16]; 5909940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array2[i + 7] = new long[16]; 6009940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 6109940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array[i + 8] = new int[16]; 6209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array2[i + 8] = new int[16]; 6309940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 6409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array[i + 9] = new double[16]; 6509940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array2[i + 9] = new double[16]; 6609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 6709940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath // Subarray types are concrete objects. 6809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array[i + 10] = new16ElementArray(String.class, String.class); 6909940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array2[i + 10] = new16ElementArray(String.class, String.class); 7009940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 7109940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array[i + 11] = new16ElementArray(Integer.class, Integer.class); 7209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array2[i + 11] = new16ElementArray(Integer.class, Integer.class); 7309940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 7409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath // Subarray types is an interface. 7509940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array[i + 12] = new16ElementArray(CharSequence.class, String.class); 7609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array2[i + 12] = new16ElementArray(CharSequence.class, String.class); 7709940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath } 7809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath } 7909940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 8009940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath public void timeDeepHashCode(int reps) { 8109940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath for (int i = 0; i < reps; ++i) { 8209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath Arrays.deepHashCode(array); 8309940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath } 8409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath } 8509940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 8609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath public void timeEquals(int reps) { 8709940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath for (int i = 0; i < reps; ++i) { 8809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath Arrays.deepEquals(array, array2); 8909940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath } 9009940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath } 9109940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 9209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath private static final Object[] new16ElementObjectarray() { 9309940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath Object[] array = new Object[16]; 9409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath for (int i = 0; i < 16; ++i) { 9509940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array[i] = new IntWrapper(i); 9609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath } 9709940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 9809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath return array; 9909940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath } 10009940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 10109940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath @SuppressWarnings("unchecked") 10209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath private static final <T, V> T[] new16ElementArray(Class<T> arrayType, Class<V> type) 10309940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath throws Exception { 10409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath T[] array = (T []) Array.newInstance(type, 16); 10509940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath if (!arrayType.isAssignableFrom(type)) { 10609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath throw new IllegalArgumentException(arrayType + " is not assignable from " + type); 10709940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath } 10809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 10909940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath Constructor<V> constructor = type.getDeclaredConstructor(String.class); 11009940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath for (int i = 0; i < 16; ++i) { 11109940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath array[i] = (T) constructor.newInstance(String.valueOf(i + 1000)); 11209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath } 11309940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 11409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath return array; 11509940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath } 11609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 11709940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath /** 11809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * A class that provides very basic equals() and hashCode() operations 11909940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * and doesn't resort to memoization tricks like {@link java.lang.Integer}. 12009940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * 12109940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * Useful for providing equal objects that aren't the same (a.equals(b) but 12209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath * a != b). 12309940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath */ 12409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath public static final class IntWrapper { 12509940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath private final int wrapped; 12609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 12709940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath public IntWrapper(int wrap) { 12809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath wrapped = wrap; 12909940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath } 13009940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 13109940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath @Override 13209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath public int hashCode() { 13309940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath return wrapped; 13409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath } 13509940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 13609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath @Override 13709940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath public boolean equals(Object o) { 13809940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath if (!(o instanceof IntWrapper)) { 13909940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath return false; 14009940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath } 14109940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 14209940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath return ((IntWrapper) o).wrapped == this.wrapped; 14309940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath } 14409940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath } 14509940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath} 14609940729ddaf3bfdfa5a04ac69d18b3d84c8b663Narayan Kamath 147