| /* |
| * Copyright (C) 2018 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. |
| */ |
| |
| public class TypeCheckBenchmark { |
| public void timeCheckCastLevel1ToLevel1(int count) { |
| Object[] arr = arr1; |
| for (int i = 0; i < count; ++i) { |
| Level1 l1 = (Level1) arr[i & 1023]; |
| } |
| } |
| |
| public void timeCheckCastLevel2ToLevel1(int count) { |
| Object[] arr = arr2; |
| for (int i = 0; i < count; ++i) { |
| Level1 l1 = (Level1) arr[i & 1023]; |
| } |
| } |
| |
| public void timeCheckCastLevel3ToLevel1(int count) { |
| Object[] arr = arr3; |
| for (int i = 0; i < count; ++i) { |
| Level1 l1 = (Level1) arr[i & 1023]; |
| } |
| } |
| |
| public void timeCheckCastLevel9ToLevel1(int count) { |
| Object[] arr = arr9; |
| for (int i = 0; i < count; ++i) { |
| Level1 l1 = (Level1) arr[i & 1023]; |
| } |
| } |
| |
| public void timeCheckCastLevel9ToLevel2(int count) { |
| Object[] arr = arr9; |
| for (int i = 0; i < count; ++i) { |
| Level2 l2 = (Level2) arr[i & 1023]; |
| } |
| } |
| |
| public void timeInstanceOfLevel1ToLevel1(int count) { |
| int sum = 0; |
| Object[] arr = arr1; |
| for (int i = 0; i < count; ++i) { |
| if (arr[i & 1023] instanceof Level1) { |
| ++sum; |
| } |
| } |
| result = sum; |
| } |
| |
| public void timeInstanceOfLevel2ToLevel1(int count) { |
| int sum = 0; |
| Object[] arr = arr2; |
| for (int i = 0; i < count; ++i) { |
| if (arr[i & 1023] instanceof Level1) { |
| ++sum; |
| } |
| } |
| result = sum; |
| } |
| |
| public void timeInstanceOfLevel3ToLevel1(int count) { |
| int sum = 0; |
| Object[] arr = arr3; |
| for (int i = 0; i < count; ++i) { |
| if (arr[i & 1023] instanceof Level1) { |
| ++sum; |
| } |
| } |
| result = sum; |
| } |
| |
| public void timeInstanceOfLevel9ToLevel1(int count) { |
| int sum = 0; |
| Object[] arr = arr9; |
| for (int i = 0; i < count; ++i) { |
| if (arr[i & 1023] instanceof Level1) { |
| ++sum; |
| } |
| } |
| result = sum; |
| } |
| |
| public void timeInstanceOfLevel9ToLevel2(int count) { |
| int sum = 0; |
| Object[] arr = arr9; |
| for (int i = 0; i < count; ++i) { |
| if (arr[i & 1023] instanceof Level2) { |
| ++sum; |
| } |
| } |
| result = sum; |
| } |
| |
| public static Object[] createArray(int level) { |
| try { |
| Class<?>[] ls = { |
| null, |
| Level1.class, |
| Level2.class, |
| Level3.class, |
| Level4.class, |
| Level5.class, |
| Level6.class, |
| Level7.class, |
| Level8.class, |
| Level9.class, |
| }; |
| Class<?> l = ls[level]; |
| Object[] array = new Object[1024]; |
| for (int i = 0; i < array.length; ++i) { |
| array[i] = l.newInstance(); |
| } |
| return array; |
| } catch (Exception unexpected) { |
| throw new Error("Initialization failure!"); |
| } |
| } |
| Object[] arr1 = createArray(1); |
| Object[] arr2 = createArray(2); |
| Object[] arr3 = createArray(3); |
| Object[] arr9 = createArray(9); |
| int result; |
| } |
| |
| class Level1 { } |
| class Level2 extends Level1 { } |
| class Level3 extends Level2 { } |
| class Level4 extends Level3 { } |
| class Level5 extends Level4 { } |
| class Level6 extends Level5 { } |
| class Level7 extends Level6 { } |
| class Level8 extends Level7 { } |
| class Level9 extends Level8 { } |