1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker * Copyright (C) 2021 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker *
4*38e8c45fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker *
8*38e8c45fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker *
10*38e8c45fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker */
16*38e8c45fSAndroid Build Coastguard Worker
17*38e8c45fSAndroid Build Coastguard Worker #include <binder/Parcel.h>
18*38e8c45fSAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
19*38e8c45fSAndroid Build Coastguard Worker
20*38e8c45fSAndroid Build Coastguard Worker // Usage: atest binderParcelBenchmark
21*38e8c45fSAndroid Build Coastguard Worker
22*38e8c45fSAndroid Build Coastguard Worker // For static assert(false) we need a template version to avoid early failure.
23*38e8c45fSAndroid Build Coastguard Worker // See: https://stackoverflow.com/questions/51523965/template-dependent-false
24*38e8c45fSAndroid Build Coastguard Worker template <typename T>
25*38e8c45fSAndroid Build Coastguard Worker constexpr bool dependent_false_v = false;
26*38e8c45fSAndroid Build Coastguard Worker
27*38e8c45fSAndroid Build Coastguard Worker template <template <typename ...> class V, typename T, typename... Args>
writeVector(android::Parcel & p,const V<T,Args...> & v)28*38e8c45fSAndroid Build Coastguard Worker void writeVector(android::Parcel &p, const V<T, Args...> &v) {
29*38e8c45fSAndroid Build Coastguard Worker if constexpr (std::is_same_v<T, bool>) {
30*38e8c45fSAndroid Build Coastguard Worker p.writeBoolVector(v);
31*38e8c45fSAndroid Build Coastguard Worker } else if constexpr (std::is_same_v<T, uint8_t>) {
32*38e8c45fSAndroid Build Coastguard Worker p.writeByteVector(v);
33*38e8c45fSAndroid Build Coastguard Worker } else if constexpr (std::is_same_v<T, char16_t>) {
34*38e8c45fSAndroid Build Coastguard Worker p.writeCharVector(v);
35*38e8c45fSAndroid Build Coastguard Worker } else if constexpr (std::is_same_v<T, int32_t>) {
36*38e8c45fSAndroid Build Coastguard Worker p.writeInt32Vector(v);
37*38e8c45fSAndroid Build Coastguard Worker } else if constexpr (std::is_same_v<T, int64_t>) {
38*38e8c45fSAndroid Build Coastguard Worker p.writeInt64Vector(v);
39*38e8c45fSAndroid Build Coastguard Worker } else {
40*38e8c45fSAndroid Build Coastguard Worker static_assert(dependent_false_v<V<T>>);
41*38e8c45fSAndroid Build Coastguard Worker }
42*38e8c45fSAndroid Build Coastguard Worker }
43*38e8c45fSAndroid Build Coastguard Worker
44*38e8c45fSAndroid Build Coastguard Worker template <template <typename ...> class V, typename T, typename... Args>
readVector(android::Parcel & p,V<T,Args...> * v)45*38e8c45fSAndroid Build Coastguard Worker void readVector(android::Parcel &p, V<T, Args...> *v) {
46*38e8c45fSAndroid Build Coastguard Worker if constexpr (std::is_same_v<T, bool>) {
47*38e8c45fSAndroid Build Coastguard Worker p.readBoolVector(v);
48*38e8c45fSAndroid Build Coastguard Worker } else if constexpr (std::is_same_v<T, uint8_t>) {
49*38e8c45fSAndroid Build Coastguard Worker p.readByteVector(v);
50*38e8c45fSAndroid Build Coastguard Worker } else if constexpr (std::is_same_v<T, char16_t>) {
51*38e8c45fSAndroid Build Coastguard Worker p.readCharVector(v);
52*38e8c45fSAndroid Build Coastguard Worker } else if constexpr (std::is_same_v<T, int32_t>) {
53*38e8c45fSAndroid Build Coastguard Worker p.readInt32Vector(v);
54*38e8c45fSAndroid Build Coastguard Worker } else if constexpr (std::is_same_v<T, int64_t>) {
55*38e8c45fSAndroid Build Coastguard Worker p.readInt64Vector(v);
56*38e8c45fSAndroid Build Coastguard Worker } else {
57*38e8c45fSAndroid Build Coastguard Worker static_assert(dependent_false_v<V<T>>);
58*38e8c45fSAndroid Build Coastguard Worker }
59*38e8c45fSAndroid Build Coastguard Worker }
60*38e8c45fSAndroid Build Coastguard Worker
61*38e8c45fSAndroid Build Coastguard Worker // Construct a series of args { 1 << 0, 1 << 1, ..., 1 << 10 }
VectorArgs(benchmark::internal::Benchmark * b)62*38e8c45fSAndroid Build Coastguard Worker static void VectorArgs(benchmark::internal::Benchmark* b) {
63*38e8c45fSAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i) {
64*38e8c45fSAndroid Build Coastguard Worker b->Args({1 << i});
65*38e8c45fSAndroid Build Coastguard Worker }
66*38e8c45fSAndroid Build Coastguard Worker }
67*38e8c45fSAndroid Build Coastguard Worker
68*38e8c45fSAndroid Build Coastguard Worker template <typename T>
BM_ParcelVector(benchmark::State & state)69*38e8c45fSAndroid Build Coastguard Worker static void BM_ParcelVector(benchmark::State& state) {
70*38e8c45fSAndroid Build Coastguard Worker const size_t elements = state.range(0);
71*38e8c45fSAndroid Build Coastguard Worker
72*38e8c45fSAndroid Build Coastguard Worker std::vector<T> v1(elements);
73*38e8c45fSAndroid Build Coastguard Worker std::vector<T> v2(elements);
74*38e8c45fSAndroid Build Coastguard Worker android::Parcel p;
75*38e8c45fSAndroid Build Coastguard Worker while (state.KeepRunning()) {
76*38e8c45fSAndroid Build Coastguard Worker p.setDataPosition(0);
77*38e8c45fSAndroid Build Coastguard Worker writeVector(p, v1);
78*38e8c45fSAndroid Build Coastguard Worker
79*38e8c45fSAndroid Build Coastguard Worker p.setDataPosition(0);
80*38e8c45fSAndroid Build Coastguard Worker readVector(p, &v2);
81*38e8c45fSAndroid Build Coastguard Worker
82*38e8c45fSAndroid Build Coastguard Worker benchmark::DoNotOptimize(v2[0]);
83*38e8c45fSAndroid Build Coastguard Worker benchmark::ClobberMemory();
84*38e8c45fSAndroid Build Coastguard Worker }
85*38e8c45fSAndroid Build Coastguard Worker state.SetComplexityN(elements);
86*38e8c45fSAndroid Build Coastguard Worker }
87*38e8c45fSAndroid Build Coastguard Worker
88*38e8c45fSAndroid Build Coastguard Worker /*
89*38e8c45fSAndroid Build Coastguard Worker Parcel vector write than read.
90*38e8c45fSAndroid Build Coastguard Worker The read and write vectors are fixed, no resizing required.
91*38e8c45fSAndroid Build Coastguard Worker
92*38e8c45fSAndroid Build Coastguard Worker Results on Crosshatch Pixel 3XL
93*38e8c45fSAndroid Build Coastguard Worker
94*38e8c45fSAndroid Build Coastguard Worker #BM_BoolVector/1 44 ns 44 ns 15630626
95*38e8c45fSAndroid Build Coastguard Worker #BM_BoolVector/2 54 ns 54 ns 12900340
96*38e8c45fSAndroid Build Coastguard Worker #BM_BoolVector/4 73 ns 72 ns 9749841
97*38e8c45fSAndroid Build Coastguard Worker #BM_BoolVector/8 107 ns 107 ns 6503326
98*38e8c45fSAndroid Build Coastguard Worker #BM_BoolVector/16 186 ns 185 ns 3773627
99*38e8c45fSAndroid Build Coastguard Worker #BM_BoolVector/32 337 ns 336 ns 2083877
100*38e8c45fSAndroid Build Coastguard Worker #BM_BoolVector/64 607 ns 605 ns 1154113
101*38e8c45fSAndroid Build Coastguard Worker #BM_BoolVector/128 1155 ns 1151 ns 608128
102*38e8c45fSAndroid Build Coastguard Worker #BM_BoolVector/256 2259 ns 2253 ns 310973
103*38e8c45fSAndroid Build Coastguard Worker #BM_BoolVector/512 4469 ns 4455 ns 157277
104*38e8c45fSAndroid Build Coastguard Worker #BM_ByteVector/1 41 ns 41 ns 16837425
105*38e8c45fSAndroid Build Coastguard Worker #BM_ByteVector/2 41 ns 41 ns 16820726
106*38e8c45fSAndroid Build Coastguard Worker #BM_ByteVector/4 38 ns 38 ns 18217813
107*38e8c45fSAndroid Build Coastguard Worker #BM_ByteVector/8 38 ns 38 ns 18290298
108*38e8c45fSAndroid Build Coastguard Worker #BM_ByteVector/16 38 ns 38 ns 18117817
109*38e8c45fSAndroid Build Coastguard Worker #BM_ByteVector/32 38 ns 38 ns 18172385
110*38e8c45fSAndroid Build Coastguard Worker #BM_ByteVector/64 41 ns 41 ns 16950055
111*38e8c45fSAndroid Build Coastguard Worker #BM_ByteVector/128 53 ns 53 ns 13170749
112*38e8c45fSAndroid Build Coastguard Worker #BM_ByteVector/256 69 ns 69 ns 10113626
113*38e8c45fSAndroid Build Coastguard Worker #BM_ByteVector/512 106 ns 106 ns 6561936
114*38e8c45fSAndroid Build Coastguard Worker #BM_CharVector/1 38 ns 38 ns 18074831
115*38e8c45fSAndroid Build Coastguard Worker #BM_CharVector/2 40 ns 40 ns 17206266
116*38e8c45fSAndroid Build Coastguard Worker #BM_CharVector/4 50 ns 50 ns 13785944
117*38e8c45fSAndroid Build Coastguard Worker #BM_CharVector/8 67 ns 67 ns 10223316
118*38e8c45fSAndroid Build Coastguard Worker #BM_CharVector/16 96 ns 96 ns 7297285
119*38e8c45fSAndroid Build Coastguard Worker #BM_CharVector/32 156 ns 155 ns 4484845
120*38e8c45fSAndroid Build Coastguard Worker #BM_CharVector/64 277 ns 276 ns 2536003
121*38e8c45fSAndroid Build Coastguard Worker #BM_CharVector/128 520 ns 518 ns 1347070
122*38e8c45fSAndroid Build Coastguard Worker #BM_CharVector/256 1006 ns 1003 ns 695952
123*38e8c45fSAndroid Build Coastguard Worker #BM_CharVector/512 1976 ns 1970 ns 354673
124*38e8c45fSAndroid Build Coastguard Worker #BM_Int32Vector/1 41 ns 41 ns 16951262
125*38e8c45fSAndroid Build Coastguard Worker #BM_Int32Vector/2 41 ns 41 ns 16916883
126*38e8c45fSAndroid Build Coastguard Worker #BM_Int32Vector/4 41 ns 41 ns 16761373
127*38e8c45fSAndroid Build Coastguard Worker #BM_Int32Vector/8 42 ns 42 ns 16553179
128*38e8c45fSAndroid Build Coastguard Worker #BM_Int32Vector/16 43 ns 43 ns 16200362
129*38e8c45fSAndroid Build Coastguard Worker #BM_Int32Vector/32 55 ns 54 ns 12724454
130*38e8c45fSAndroid Build Coastguard Worker #BM_Int32Vector/64 70 ns 69 ns 10049223
131*38e8c45fSAndroid Build Coastguard Worker #BM_Int32Vector/128 107 ns 107 ns 6525796
132*38e8c45fSAndroid Build Coastguard Worker #BM_Int32Vector/256 179 ns 178 ns 3922563
133*38e8c45fSAndroid Build Coastguard Worker #BM_Int32Vector/512 324 ns 323 ns 2160653
134*38e8c45fSAndroid Build Coastguard Worker #BM_Int64Vector/1 41 ns 41 ns 16909470
135*38e8c45fSAndroid Build Coastguard Worker #BM_Int64Vector/2 41 ns 41 ns 16740788
136*38e8c45fSAndroid Build Coastguard Worker #BM_Int64Vector/4 42 ns 42 ns 16564197
137*38e8c45fSAndroid Build Coastguard Worker #BM_Int64Vector/8 43 ns 42 ns 16284082
138*38e8c45fSAndroid Build Coastguard Worker #BM_Int64Vector/16 54 ns 54 ns 12839474
139*38e8c45fSAndroid Build Coastguard Worker #BM_Int64Vector/32 69 ns 69 ns 10011010
140*38e8c45fSAndroid Build Coastguard Worker #BM_Int64Vector/64 107 ns 106 ns 6557956
141*38e8c45fSAndroid Build Coastguard Worker #BM_Int64Vector/128 177 ns 177 ns 3925618
142*38e8c45fSAndroid Build Coastguard Worker #BM_Int64Vector/256 324 ns 323 ns 2163321
143*38e8c45fSAndroid Build Coastguard Worker #BM_Int64Vector/512 613 ns 611 ns 1140418
144*38e8c45fSAndroid Build Coastguard Worker */
145*38e8c45fSAndroid Build Coastguard Worker
BM_BoolVector(benchmark::State & state)146*38e8c45fSAndroid Build Coastguard Worker static void BM_BoolVector(benchmark::State& state) {
147*38e8c45fSAndroid Build Coastguard Worker BM_ParcelVector<bool>(state);
148*38e8c45fSAndroid Build Coastguard Worker }
149*38e8c45fSAndroid Build Coastguard Worker
BM_ByteVector(benchmark::State & state)150*38e8c45fSAndroid Build Coastguard Worker static void BM_ByteVector(benchmark::State& state) {
151*38e8c45fSAndroid Build Coastguard Worker BM_ParcelVector<uint8_t>(state);
152*38e8c45fSAndroid Build Coastguard Worker }
153*38e8c45fSAndroid Build Coastguard Worker
BM_CharVector(benchmark::State & state)154*38e8c45fSAndroid Build Coastguard Worker static void BM_CharVector(benchmark::State& state) {
155*38e8c45fSAndroid Build Coastguard Worker BM_ParcelVector<char16_t>(state);
156*38e8c45fSAndroid Build Coastguard Worker }
157*38e8c45fSAndroid Build Coastguard Worker
BM_Int32Vector(benchmark::State & state)158*38e8c45fSAndroid Build Coastguard Worker static void BM_Int32Vector(benchmark::State& state) {
159*38e8c45fSAndroid Build Coastguard Worker BM_ParcelVector<int32_t>(state);
160*38e8c45fSAndroid Build Coastguard Worker }
161*38e8c45fSAndroid Build Coastguard Worker
BM_Int64Vector(benchmark::State & state)162*38e8c45fSAndroid Build Coastguard Worker static void BM_Int64Vector(benchmark::State& state) {
163*38e8c45fSAndroid Build Coastguard Worker BM_ParcelVector<int64_t>(state);
164*38e8c45fSAndroid Build Coastguard Worker }
165*38e8c45fSAndroid Build Coastguard Worker
166*38e8c45fSAndroid Build Coastguard Worker BENCHMARK(BM_BoolVector)->Apply(VectorArgs);
167*38e8c45fSAndroid Build Coastguard Worker BENCHMARK(BM_ByteVector)->Apply(VectorArgs);
168*38e8c45fSAndroid Build Coastguard Worker BENCHMARK(BM_CharVector)->Apply(VectorArgs);
169*38e8c45fSAndroid Build Coastguard Worker BENCHMARK(BM_Int32Vector)->Apply(VectorArgs);
170*38e8c45fSAndroid Build Coastguard Worker BENCHMARK(BM_Int64Vector)->Apply(VectorArgs);
171*38e8c45fSAndroid Build Coastguard Worker
172*38e8c45fSAndroid Build Coastguard Worker BENCHMARK_MAIN();
173