xref: /aosp_15_r20/system/logging/logcat/tests/logcat_benchmark.cpp (revision 598139dc91b21518d67c408eaea2644226490971)
1*598139dcSAndroid Build Coastguard Worker /*
2*598139dcSAndroid Build Coastguard Worker  * Copyright (C) 2013-2014 The Android Open Source Project
3*598139dcSAndroid Build Coastguard Worker  *
4*598139dcSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*598139dcSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*598139dcSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*598139dcSAndroid Build Coastguard Worker  *
8*598139dcSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*598139dcSAndroid Build Coastguard Worker  *
10*598139dcSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*598139dcSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*598139dcSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*598139dcSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*598139dcSAndroid Build Coastguard Worker  * limitations under the License.
15*598139dcSAndroid Build Coastguard Worker  */
16*598139dcSAndroid Build Coastguard Worker 
17*598139dcSAndroid Build Coastguard Worker #include <stdio.h>
18*598139dcSAndroid Build Coastguard Worker #include <stdlib.h>
19*598139dcSAndroid Build Coastguard Worker #include <string.h>
20*598139dcSAndroid Build Coastguard Worker 
21*598139dcSAndroid Build Coastguard Worker #include <benchmark/benchmark.h>
22*598139dcSAndroid Build Coastguard Worker 
23*598139dcSAndroid Build Coastguard Worker static const char begin[] = "--------- beginning of ";
24*598139dcSAndroid Build Coastguard Worker 
BM_logcat_sorted_order(benchmark::State & state)25*598139dcSAndroid Build Coastguard Worker static void BM_logcat_sorted_order(benchmark::State& state) {
26*598139dcSAndroid Build Coastguard Worker     FILE* fp;
27*598139dcSAndroid Build Coastguard Worker 
28*598139dcSAndroid Build Coastguard Worker     if (!state.KeepRunning()) return;
29*598139dcSAndroid Build Coastguard Worker 
30*598139dcSAndroid Build Coastguard Worker     fp = popen(
31*598139dcSAndroid Build Coastguard Worker         "logcat -v time -b radio -b events -b system -b main -d 2>/dev/null",
32*598139dcSAndroid Build Coastguard Worker         "r");
33*598139dcSAndroid Build Coastguard Worker     if (!fp) return;
34*598139dcSAndroid Build Coastguard Worker 
35*598139dcSAndroid Build Coastguard Worker     class timestamp {
36*598139dcSAndroid Build Coastguard Worker        private:
37*598139dcSAndroid Build Coastguard Worker         int month;
38*598139dcSAndroid Build Coastguard Worker         int day;
39*598139dcSAndroid Build Coastguard Worker         int hour;
40*598139dcSAndroid Build Coastguard Worker         int minute;
41*598139dcSAndroid Build Coastguard Worker         int second;
42*598139dcSAndroid Build Coastguard Worker         int millisecond;
43*598139dcSAndroid Build Coastguard Worker         bool ok;
44*598139dcSAndroid Build Coastguard Worker 
45*598139dcSAndroid Build Coastguard Worker        public:
46*598139dcSAndroid Build Coastguard Worker         void init(const char* buffer) {
47*598139dcSAndroid Build Coastguard Worker             ok = false;
48*598139dcSAndroid Build Coastguard Worker             if (buffer != NULL) {
49*598139dcSAndroid Build Coastguard Worker                 ok = sscanf(buffer, "%d-%d %d:%d:%d.%d ", &month, &day, &hour,
50*598139dcSAndroid Build Coastguard Worker                             &minute, &second, &millisecond) == 6;
51*598139dcSAndroid Build Coastguard Worker             }
52*598139dcSAndroid Build Coastguard Worker         }
53*598139dcSAndroid Build Coastguard Worker 
54*598139dcSAndroid Build Coastguard Worker         explicit timestamp(const char* buffer) {
55*598139dcSAndroid Build Coastguard Worker             init(buffer);
56*598139dcSAndroid Build Coastguard Worker         }
57*598139dcSAndroid Build Coastguard Worker 
58*598139dcSAndroid Build Coastguard Worker         bool operator<(timestamp& T) {
59*598139dcSAndroid Build Coastguard Worker             return !ok || !T.ok || (month < T.month) ||
60*598139dcSAndroid Build Coastguard Worker                    ((month == T.month) &&
61*598139dcSAndroid Build Coastguard Worker                     ((day < T.day) ||
62*598139dcSAndroid Build Coastguard Worker                      ((day == T.day) &&
63*598139dcSAndroid Build Coastguard Worker                       ((hour < T.hour) ||
64*598139dcSAndroid Build Coastguard Worker                        ((hour == T.hour) &&
65*598139dcSAndroid Build Coastguard Worker                         ((minute < T.minute) ||
66*598139dcSAndroid Build Coastguard Worker                          ((minute == T.minute) &&
67*598139dcSAndroid Build Coastguard Worker                           ((second < T.second) ||
68*598139dcSAndroid Build Coastguard Worker                            ((second == T.second) &&
69*598139dcSAndroid Build Coastguard Worker                             (millisecond < T.millisecond))))))))));
70*598139dcSAndroid Build Coastguard Worker         }
71*598139dcSAndroid Build Coastguard Worker 
72*598139dcSAndroid Build Coastguard Worker         bool valid(void) {
73*598139dcSAndroid Build Coastguard Worker             return ok;
74*598139dcSAndroid Build Coastguard Worker         }
75*598139dcSAndroid Build Coastguard Worker     } last(NULL);
76*598139dcSAndroid Build Coastguard Worker 
77*598139dcSAndroid Build Coastguard Worker     char* last_buffer = NULL;
78*598139dcSAndroid Build Coastguard Worker     char buffer[5120];
79*598139dcSAndroid Build Coastguard Worker 
80*598139dcSAndroid Build Coastguard Worker     int count = 0;
81*598139dcSAndroid Build Coastguard Worker     int next_lt_last = 0;
82*598139dcSAndroid Build Coastguard Worker 
83*598139dcSAndroid Build Coastguard Worker     while (fgets(buffer, sizeof(buffer), fp)) {
84*598139dcSAndroid Build Coastguard Worker         if (!strncmp(begin, buffer, sizeof(begin) - 1)) {
85*598139dcSAndroid Build Coastguard Worker             continue;
86*598139dcSAndroid Build Coastguard Worker         }
87*598139dcSAndroid Build Coastguard Worker         if (!last.valid()) {
88*598139dcSAndroid Build Coastguard Worker             free(last_buffer);
89*598139dcSAndroid Build Coastguard Worker             last_buffer = strdup(buffer);
90*598139dcSAndroid Build Coastguard Worker             last.init(buffer);
91*598139dcSAndroid Build Coastguard Worker         }
92*598139dcSAndroid Build Coastguard Worker         timestamp next(buffer);
93*598139dcSAndroid Build Coastguard Worker         if (next < last) {
94*598139dcSAndroid Build Coastguard Worker             if (last_buffer) {
95*598139dcSAndroid Build Coastguard Worker                 fprintf(stderr, "<%s", last_buffer);
96*598139dcSAndroid Build Coastguard Worker             }
97*598139dcSAndroid Build Coastguard Worker             fprintf(stderr, ">%s", buffer);
98*598139dcSAndroid Build Coastguard Worker             ++next_lt_last;
99*598139dcSAndroid Build Coastguard Worker         }
100*598139dcSAndroid Build Coastguard Worker         if (next.valid()) {
101*598139dcSAndroid Build Coastguard Worker             free(last_buffer);
102*598139dcSAndroid Build Coastguard Worker             last_buffer = strdup(buffer);
103*598139dcSAndroid Build Coastguard Worker             last.init(buffer);
104*598139dcSAndroid Build Coastguard Worker         }
105*598139dcSAndroid Build Coastguard Worker         ++count;
106*598139dcSAndroid Build Coastguard Worker     }
107*598139dcSAndroid Build Coastguard Worker     free(last_buffer);
108*598139dcSAndroid Build Coastguard Worker 
109*598139dcSAndroid Build Coastguard Worker     pclose(fp);
110*598139dcSAndroid Build Coastguard Worker 
111*598139dcSAndroid Build Coastguard Worker     static const int max_ok = 2;
112*598139dcSAndroid Build Coastguard Worker 
113*598139dcSAndroid Build Coastguard Worker     // Allow few fails, happens with readers active
114*598139dcSAndroid Build Coastguard Worker     fprintf(stderr, "%s: %d/%d out of order entries\n",
115*598139dcSAndroid Build Coastguard Worker             (next_lt_last) ? ((next_lt_last <= max_ok) ? "WARNING" : "ERROR")
116*598139dcSAndroid Build Coastguard Worker                            : "INFO",
117*598139dcSAndroid Build Coastguard Worker             next_lt_last, count);
118*598139dcSAndroid Build Coastguard Worker 
119*598139dcSAndroid Build Coastguard Worker     if (next_lt_last > max_ok) {
120*598139dcSAndroid Build Coastguard Worker         fprintf(stderr, "EXPECT_GE(max_ok=%d, next_lt_last=%d)\n", max_ok,
121*598139dcSAndroid Build Coastguard Worker                 next_lt_last);
122*598139dcSAndroid Build Coastguard Worker     }
123*598139dcSAndroid Build Coastguard Worker 
124*598139dcSAndroid Build Coastguard Worker     // sample statistically too small
125*598139dcSAndroid Build Coastguard Worker     if (count < 100) {
126*598139dcSAndroid Build Coastguard Worker         fprintf(stderr, "EXPECT_LT(100, count=%d)\n", count);
127*598139dcSAndroid Build Coastguard Worker     }
128*598139dcSAndroid Build Coastguard Worker 
129*598139dcSAndroid Build Coastguard Worker     state.KeepRunning();
130*598139dcSAndroid Build Coastguard Worker }
131*598139dcSAndroid Build Coastguard Worker BENCHMARK(BM_logcat_sorted_order);
132*598139dcSAndroid Build Coastguard Worker 
133*598139dcSAndroid Build Coastguard Worker BENCHMARK_MAIN();
134