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