1 /*
2 * Copyright (C) 2023 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 #include "benchmark/benchmark.h"
18 #include "tests/statsd_test_util.h"
19 #include "utils/DbUtils.h"
20
21 using namespace std;
22
23 namespace android {
24 namespace os {
25 namespace statsd {
26 namespace dbutils {
27
BM_insertAtomsIntoDbTablesNewConnection(benchmark::State & state)28 static void BM_insertAtomsIntoDbTablesNewConnection(benchmark::State& state) {
29 ConfigKey key = ConfigKey(111, 222);
30 int64_t metricId = 0;
31 int64_t bucketStartTimeNs = 10000000000;
32
33 unique_ptr<LogEvent> event =
34 CreateScreenStateChangedEvent(bucketStartTimeNs, android::view::DISPLAY_STATE_OFF);
35 vector<LogEvent> logEvents;
36 for (int j = 0; j < state.range(1); ++j) {
37 logEvents.push_back(*event.get());
38 }
39 string err;
40 for (auto s : state) {
41 for (int metricId = 0; metricId < state.range(0); ++metricId) {
42 state.PauseTiming();
43 deleteDb(key);
44 createTableIfNeeded(key, metricId, *event.get());
45 state.ResumeTiming();
46 insert(key, metricId, logEvents, err);
47 }
48 }
49 deleteDb(key);
50 }
51
52 BENCHMARK(BM_insertAtomsIntoDbTablesNewConnection)
53 ->Args({1, 10})
54 ->Args({1, 50})
55 ->Args({1, 100})
56 ->Args({1, 500})
57 ->Args({10, 10})
58 ->Args({10, 20});
59
BM_insertAtomsIntoDbTablesReuseConnection(benchmark::State & state)60 static void BM_insertAtomsIntoDbTablesReuseConnection(benchmark::State& state) {
61 ConfigKey key = ConfigKey(111, 222);
62 int64_t metricId = 0;
63 int64_t bucketStartTimeNs = 10000000000;
64
65 unique_ptr<LogEvent> event =
66 CreateScreenStateChangedEvent(bucketStartTimeNs, android::view::DISPLAY_STATE_OFF);
67 vector<LogEvent> logEvents;
68 for (int j = 0; j < state.range(1); ++j) {
69 logEvents.push_back(*event.get());
70 }
71 sqlite3* dbHandle = getDb(key);
72 string err;
73 for (auto s : state) {
74 for (int metricId = 0; metricId < state.range(0); ++metricId) {
75 state.PauseTiming();
76 deleteTable(key, metricId);
77 createTableIfNeeded(key, metricId, *event.get());
78 state.ResumeTiming();
79 insert(key, metricId, logEvents, err);
80 }
81 }
82 closeDb(dbHandle);
83 deleteDb(key);
84 }
85
86 BENCHMARK(BM_insertAtomsIntoDbTablesReuseConnection)
87 ->Args({1, 10})
88 ->Args({1, 50})
89 ->Args({1, 100})
90 ->Args({1, 500})
91 ->Args({10, 10})
92 ->Args({10, 20});
93
BM_createDbTables(benchmark::State & state)94 static void BM_createDbTables(benchmark::State& state) {
95 ConfigKey key = ConfigKey(111, 222);
96 int64_t metricId = 0;
97 int64_t bucketStartTimeNs = 10000000000;
98
99 unique_ptr<LogEvent> event =
100 CreateScreenStateChangedEvent(bucketStartTimeNs, android::view::DISPLAY_STATE_OFF);
101 vector<LogEvent> logEvents{*event.get()};
102 string err;
103 for (auto s : state) {
104 state.PauseTiming();
105 deleteTable(key, metricId);
106 state.ResumeTiming();
107 createTableIfNeeded(key, metricId, *event.get());
108 insert(key, metricId, logEvents, err);
109 }
110 deleteDb(key);
111 }
112
113 BENCHMARK(BM_createDbTables);
114 } // namespace dbutils
115 } // namespace statsd
116 } // namespace os
117 } // namespace android
118