diff options
author | Vladimir Marko <vmarko@google.com> | 2018-01-10 18:26:38 +0000 |
---|---|---|
committer | Vladimir Marko <vmarko@google.com> | 2018-01-23 13:02:59 +0000 |
commit | eb0ebed72432b3c6b8c7b38f8937d7ba736f4567 (patch) | |
tree | 74d95eb4bfbf01ef6fd3a68695f5d7cec69338d7 /benchmark | |
parent | e57043081e6b091a9fd23a84043373148ae72f1f (diff) | |
download | android_art-eb0ebed72432b3c6b8c7b38f8937d7ba736f4567.tar.gz android_art-eb0ebed72432b3c6b8c7b38f8937d7ba736f4567.tar.bz2 android_art-eb0ebed72432b3c6b8c7b38f8937d7ba736f4567.zip |
Compiler changes for bitstring based type checks.
We guard the use of this feature with a compile-time flag,
set to true in this CL.
Boot image size for aosp_taimen-userdebug in AOSP master:
- before:
arm boot*.oat: 63604740
arm64 boot*.oat: 74237864
- after:
arm boot*.oat: 63531172 (-72KiB, -0.1%)
arm64 boot*.oat: 74135008 (-100KiB, -0.1%)
The new TypeCheckBenchmark yields the following changes
using the little cores of taimen fixed at 1.4016GHz:
32-bit 64-bit
timeCheckCastLevel1ToLevel1 11.48->15.80 11.47->15.78
timeCheckCastLevel2ToLevel1 15.08->15.79 15.08->15.79
timeCheckCastLevel3ToLevel1 19.01->15.82 17.94->15.81
timeCheckCastLevel9ToLevel1 42.55->15.79 42.63->15.81
timeCheckCastLevel9ToLevel2 39.70->14.36 39.70->14.35
timeInstanceOfLevel1ToLevel1 13.74->17.93 13.76->17.95
timeInstanceOfLevel2ToLevel1 17.02->17.95 16.99->17.93
timeInstanceOfLevel3ToLevel1 24.03->17.95 24.45->17.95
timeInstanceOfLevel9ToLevel1 47.13->17.95 47.14->18.00
timeInstanceOfLevel9ToLevel2 44.19->16.52 44.27->16.51
This suggests that the bitstring typecheck should not be
used for exact type checks which would be equivalent to the
"Level1ToLevel1" benchmark. Whether the implementation is
a beneficial replacement for the kClassHierarchyCheck and
kAbstractClassCheck on average depends on how many levels
from the target class (or Object for a negative result) is
a typical object's class.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing --jit
Test: testrunner.py --host -t 670-bitstring-type-check
Test: Pixel 2 XL boots.
Test: testrunner.py --target --optimizing --jit
Test: testrunner.py --target -t 670-bitstring-type-check
Bug: 64692057
Bug: 71853552
Bug: 26687569
Change-Id: I538d7e036b5a8ae2cc3fe77662a5903d74854562
Diffstat (limited to 'benchmark')
-rw-r--r-- | benchmark/type-check/info.txt | 1 | ||||
-rw-r--r-- | benchmark/type-check/src/TypeCheckBenchmark.java | 147 |
2 files changed, 148 insertions, 0 deletions
diff --git a/benchmark/type-check/info.txt b/benchmark/type-check/info.txt new file mode 100644 index 0000000000..d14fb9685b --- /dev/null +++ b/benchmark/type-check/info.txt @@ -0,0 +1 @@ +Benchmarks for repeating check-cast and instance-of instructions in a loop. diff --git a/benchmark/type-check/src/TypeCheckBenchmark.java b/benchmark/type-check/src/TypeCheckBenchmark.java new file mode 100644 index 0000000000..96904d99b6 --- /dev/null +++ b/benchmark/type-check/src/TypeCheckBenchmark.java @@ -0,0 +1,147 @@ +/* + * 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 { } |