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