1 /*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 // The functions we want to benchmark are static, so include the source code.
18 #include "luni/src/main/native/libcore_io_Memory.cpp"
19
20 #include <benchmark/benchmark.h>
21
22 template<typename T, size_t ALIGN>
swap_bench(benchmark::State & state,void (* swap_func)(T *,const T *,size_t))23 void swap_bench(benchmark::State& state, void (*swap_func)(T*, const T*, size_t)) {
24 size_t num_elements = state.range_x();
25
26 T* src;
27 T* dst;
28 T* src_elems;
29 T* dst_elems;
30
31 if (ALIGN) {
32 src_elems = new T[num_elements + 1];
33 dst_elems = new T[num_elements + 1];
34
35 src = reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(src_elems) + ALIGN);
36 dst = reinterpret_cast<T*>(reinterpret_cast<uintptr_t>(dst_elems) + ALIGN);
37 } else {
38 src_elems = new T[num_elements];
39 dst_elems = new T[num_elements];
40
41 src = src_elems;
42 dst = dst_elems;
43 }
44
45 memset(dst, 0, sizeof(T) * num_elements);
46 memset(src, 0x12, sizeof(T) * num_elements);
47
48 while (state.KeepRunning()) {
49 swap_func(src, dst, num_elements);
50 }
51
52 delete[] src_elems;
53 delete[] dst_elems;
54 }
55
56 #define AT_COMMON_VALUES \
57 Arg(10)->Arg(100)->Arg(1000)->Arg(1024*10)->Arg(1024*100)
58
59 // Aligned.
60
BM_swapShorts_aligned(benchmark::State & state)61 static void BM_swapShorts_aligned(benchmark::State& state) {
62 swap_bench<jshort, 0>(state, swapShorts);
63 }
64 BENCHMARK(BM_swapShorts_aligned)->AT_COMMON_VALUES;
65
BM_swapInts_aligned(benchmark::State & state)66 static void BM_swapInts_aligned(benchmark::State& state) {
67 swap_bench<jint, 0>(state, swapInts);
68 }
69 BENCHMARK(BM_swapInts_aligned)->AT_COMMON_VALUES;
70
BM_swapLongs_aligned(benchmark::State & state)71 static void BM_swapLongs_aligned(benchmark::State& state) {
72 swap_bench<jlong, 0>(state, swapLongs);
73 }
74 BENCHMARK(BM_swapLongs_aligned)->AT_COMMON_VALUES;
75
76 // Unaligned 1.
77
BM_swapShorts_unaligned_1(benchmark::State & state)78 static void BM_swapShorts_unaligned_1(benchmark::State& state) {
79 swap_bench<jshort, 1>(state, swapShorts);
80 }
81 BENCHMARK(BM_swapShorts_unaligned_1)->AT_COMMON_VALUES;
82
BM_swapInts_unaligned_1(benchmark::State & state)83 static void BM_swapInts_unaligned_1(benchmark::State& state) {
84 swap_bench<jint, 1>(state, swapInts);
85 }
86 BENCHMARK(BM_swapInts_unaligned_1)->AT_COMMON_VALUES;
87
BM_swapLongs_unaligned_1(benchmark::State & state)88 static void BM_swapLongs_unaligned_1(benchmark::State& state) {
89 swap_bench<jlong, 1>(state, swapLongs);
90 }
91 BENCHMARK(BM_swapLongs_unaligned_1)->AT_COMMON_VALUES;
92
93 // Unaligned 2.
94
BM_swapShorts_unaligned_2(benchmark::State & state)95 static void BM_swapShorts_unaligned_2(benchmark::State& state) {
96 swap_bench<jshort, 2>(state, swapShorts);
97 }
98 BENCHMARK(BM_swapShorts_unaligned_2)->AT_COMMON_VALUES;
99
BM_swapInts_unaligned_2(benchmark::State & state)100 static void BM_swapInts_unaligned_2(benchmark::State& state) {
101 swap_bench<jint, 2>(state, swapInts);
102 }
103 BENCHMARK(BM_swapInts_unaligned_2)->AT_COMMON_VALUES;
104
BM_swapLongs_unaligned_2(benchmark::State & state)105 static void BM_swapLongs_unaligned_2(benchmark::State& state) {
106 swap_bench<jlong, 2>(state, swapLongs);
107 }
108 BENCHMARK(BM_swapLongs_unaligned_2)->AT_COMMON_VALUES;
109
110
111 BENCHMARK_MAIN();
112