blob: 1b66a562a409d2931342cdce084f73e6bd0d5e1c [file] [log] [blame]
Mark Salyzyn819c58a2013-11-22 12:39:43 -08001/*
2 * Copyright (C) 2013-2014 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
Mark Salyzyn163ebdc2015-12-16 13:11:36 -080017#include <fcntl.h>
18#include <sys/endian.h>
Mark Salyzyn819c58a2013-11-22 12:39:43 -080019#include <sys/socket.h>
Mark Salyzyn163ebdc2015-12-16 13:11:36 -080020#include <sys/types.h>
21#include <unistd.h>
22
Mark Salyzyn819c58a2013-11-22 12:39:43 -080023#include <cutils/sockets.h>
24#include <log/log.h>
25#include <log/logger.h>
26#include <log/log_read.h>
Mark Salyzyn163ebdc2015-12-16 13:11:36 -080027#include <private/android_logger.h>
Mark Salyzyn819c58a2013-11-22 12:39:43 -080028
29#include "benchmark.h"
30
31// enhanced version of LOG_FAILURE_RETRY to add support for EAGAIN and
32// non-syscall libs. Since we are benchmarking, or using this in the emergency
33// signal to stuff a terminating code, we do NOT want to introduce
34// a syscall or usleep on EAGAIN retry.
35#define LOG_FAILURE_RETRY(exp) ({ \
36 typeof (exp) _rc; \
37 do { \
38 _rc = (exp); \
39 } while (((_rc == -1) \
40 && ((errno == EINTR) \
41 || (errno == EAGAIN))) \
42 || (_rc == -EINTR) \
43 || (_rc == -EAGAIN)); \
44 _rc; })
45
46/*
47 * Measure the fastest rate we can reliabley stuff print messages into
48 * the log at high pressure. Expect this to be less than double the process
49 * wakeup time (2ms?)
50 */
51static void BM_log_maximum_retry(int iters) {
52 StartBenchmarkTiming();
53
54 for (int i = 0; i < iters; ++i) {
55 LOG_FAILURE_RETRY(
56 __android_log_print(ANDROID_LOG_INFO,
57 "BM_log_maximum_retry", "%d", i));
58 }
59
60 StopBenchmarkTiming();
61}
62BENCHMARK(BM_log_maximum_retry);
63
64/*
65 * Measure the fastest rate we can stuff print messages into the log
66 * at high pressure. Expect this to be less than double the process wakeup
67 * time (2ms?)
68 */
69static void BM_log_maximum(int iters) {
70 StartBenchmarkTiming();
71
72 for (int i = 0; i < iters; ++i) {
73 __android_log_print(ANDROID_LOG_INFO, "BM_log_maximum", "%d", i);
74 }
75
76 StopBenchmarkTiming();
77}
78BENCHMARK(BM_log_maximum);
79
80/*
81 * Measure the time it takes to submit the android logging call using
82 * discrete acquisition under light load. Expect this to be a pair of
83 * syscall periods (2us).
84 */
85static void BM_clock_overhead(int iters) {
86 for (int i = 0; i < iters; ++i) {
87 StartBenchmarkTiming();
88 StopBenchmarkTiming();
89 }
90}
91BENCHMARK(BM_clock_overhead);
92
93/*
Mark Salyzyn163ebdc2015-12-16 13:11:36 -080094 * Measure the time it takes to submit the android logging data to pstore
95 */
96static void BM_pmsg_short(int iters) {
97
98 int pstore_fd = TEMP_FAILURE_RETRY(open("/dev/pmsg0", O_WRONLY));
99 if (pstore_fd < 0) {
100 return;
101 }
102
103 /*
104 * struct {
105 * // what we provide to pstore
106 * android_pmsg_log_header_t pmsg_header;
107 * // what we provide to socket
108 * android_log_header_t header;
109 * // caller provides
110 * union {
111 * struct {
112 * char prio;
113 * char payload[];
114 * } string;
115 * struct {
116 * uint32_t tag
117 * char payload[];
118 * } binary;
119 * };
120 * };
121 */
122
123 struct timespec ts;
124 clock_gettime(android_log_clockid(), &ts);
125
126 android_pmsg_log_header_t pmsg_header;
127 pmsg_header.magic = LOGGER_MAGIC;
128 pmsg_header.len = sizeof(android_pmsg_log_header_t)
129 + sizeof(android_log_header_t);
130 pmsg_header.uid = getuid();
131 pmsg_header.pid = getpid();
132
133 android_log_header_t header;
134 header.tid = gettid();
135 header.realtime.tv_sec = ts.tv_sec;
136 header.realtime.tv_nsec = ts.tv_nsec;
137
138 static const unsigned nr = 1;
139 static const unsigned header_length = 2;
140 struct iovec newVec[nr + header_length];
141
142 newVec[0].iov_base = (unsigned char *) &pmsg_header;
143 newVec[0].iov_len = sizeof(pmsg_header);
144 newVec[1].iov_base = (unsigned char *) &header;
145 newVec[1].iov_len = sizeof(header);
146
147 android_log_event_int_t buffer;
148
149 header.id = LOG_ID_EVENTS;
150 buffer.header.tag = 0;
151 buffer.payload.type = EVENT_TYPE_INT;
152 uint32_t snapshot = 0;
153 buffer.payload.data = htole32(snapshot);
154
155 newVec[2].iov_base = &buffer;
156 newVec[2].iov_len = sizeof(buffer);
157
158 StartBenchmarkTiming();
159 for (int i = 0; i < iters; ++i) {
160 ++snapshot;
161 buffer.payload.data = htole32(snapshot);
162 writev(pstore_fd, newVec, nr);
163 }
164 StopBenchmarkTiming();
165 close(pstore_fd);
166}
167BENCHMARK(BM_pmsg_short);
168
169/*
170 * Measure the time it takes to submit the android logging data to pstore
171 * best case aligned single block.
172 */
173static void BM_pmsg_short_aligned(int iters) {
174
175 int pstore_fd = TEMP_FAILURE_RETRY(open("/dev/pmsg0", O_WRONLY));
176 if (pstore_fd < 0) {
177 return;
178 }
179
180 /*
181 * struct {
182 * // what we provide to pstore
183 * android_pmsg_log_header_t pmsg_header;
184 * // what we provide to socket
185 * android_log_header_t header;
186 * // caller provides
187 * union {
188 * struct {
189 * char prio;
190 * char payload[];
191 * } string;
192 * struct {
193 * uint32_t tag
194 * char payload[];
195 * } binary;
196 * };
197 * };
198 */
199
200 struct timespec ts;
201 clock_gettime(android_log_clockid(), &ts);
202
203 struct packet {
204 android_pmsg_log_header_t pmsg_header;
205 android_log_header_t header;
206 android_log_event_int_t payload;
207 };
Elliott Hughes5f4a9462016-06-06 19:56:24 -0700208 alignas(8) char buf[sizeof(struct packet) + 8];
Mark Salyzyn163ebdc2015-12-16 13:11:36 -0800209 memset(buf, 0, sizeof(buf));
210 struct packet *buffer = (struct packet*)(((uintptr_t)buf + 7) & ~7);
211 if (((uintptr_t)&buffer->pmsg_header) & 7) {
212 fprintf (stderr, "&buffer=0x%p iters=%d\n", &buffer->pmsg_header, iters);
213 }
214
215 buffer->pmsg_header.magic = LOGGER_MAGIC;
216 buffer->pmsg_header.len = sizeof(android_pmsg_log_header_t)
217 + sizeof(android_log_header_t);
218 buffer->pmsg_header.uid = getuid();
219 buffer->pmsg_header.pid = getpid();
220
221 buffer->header.tid = gettid();
222 buffer->header.realtime.tv_sec = ts.tv_sec;
223 buffer->header.realtime.tv_nsec = ts.tv_nsec;
224
225 buffer->header.id = LOG_ID_EVENTS;
226 buffer->payload.header.tag = 0;
227 buffer->payload.payload.type = EVENT_TYPE_INT;
228 uint32_t snapshot = 0;
229 buffer->payload.payload.data = htole32(snapshot);
230
231 StartBenchmarkTiming();
232 for (int i = 0; i < iters; ++i) {
233 ++snapshot;
234 buffer->payload.payload.data = htole32(snapshot);
235 write(pstore_fd, &buffer->pmsg_header,
236 sizeof(android_pmsg_log_header_t) +
237 sizeof(android_log_header_t) +
238 sizeof(android_log_event_int_t));
239 }
240 StopBenchmarkTiming();
241 close(pstore_fd);
242}
243BENCHMARK(BM_pmsg_short_aligned);
244
245/*
246 * Measure the time it takes to submit the android logging data to pstore
247 * best case aligned single block.
248 */
249static void BM_pmsg_short_unaligned1(int iters) {
250
251 int pstore_fd = TEMP_FAILURE_RETRY(open("/dev/pmsg0", O_WRONLY));
252 if (pstore_fd < 0) {
253 return;
254 }
255
256 /*
257 * struct {
258 * // what we provide to pstore
259 * android_pmsg_log_header_t pmsg_header;
260 * // what we provide to socket
261 * android_log_header_t header;
262 * // caller provides
263 * union {
264 * struct {
265 * char prio;
266 * char payload[];
267 * } string;
268 * struct {
269 * uint32_t tag
270 * char payload[];
271 * } binary;
272 * };
273 * };
274 */
275
276 struct timespec ts;
277 clock_gettime(android_log_clockid(), &ts);
278
279 struct packet {
280 android_pmsg_log_header_t pmsg_header;
281 android_log_header_t header;
282 android_log_event_int_t payload;
283 };
Elliott Hughes5f4a9462016-06-06 19:56:24 -0700284 alignas(8) char buf[sizeof(struct packet) + 8];
Mark Salyzyn163ebdc2015-12-16 13:11:36 -0800285 memset(buf, 0, sizeof(buf));
286 struct packet *buffer = (struct packet*)((((uintptr_t)buf + 7) & ~7) + 1);
287 if ((((uintptr_t)&buffer->pmsg_header) & 7) != 1) {
288 fprintf (stderr, "&buffer=0x%p iters=%d\n", &buffer->pmsg_header, iters);
289 }
290
291 buffer->pmsg_header.magic = LOGGER_MAGIC;
292 buffer->pmsg_header.len = sizeof(android_pmsg_log_header_t)
293 + sizeof(android_log_header_t);
294 buffer->pmsg_header.uid = getuid();
295 buffer->pmsg_header.pid = getpid();
296
297 buffer->header.tid = gettid();
298 buffer->header.realtime.tv_sec = ts.tv_sec;
299 buffer->header.realtime.tv_nsec = ts.tv_nsec;
300
301 buffer->header.id = LOG_ID_EVENTS;
302 buffer->payload.header.tag = 0;
303 buffer->payload.payload.type = EVENT_TYPE_INT;
304 uint32_t snapshot = 0;
305 buffer->payload.payload.data = htole32(snapshot);
306
307 StartBenchmarkTiming();
308 for (int i = 0; i < iters; ++i) {
309 ++snapshot;
310 buffer->payload.payload.data = htole32(snapshot);
311 write(pstore_fd, &buffer->pmsg_header,
312 sizeof(android_pmsg_log_header_t) +
313 sizeof(android_log_header_t) +
314 sizeof(android_log_event_int_t));
315 }
316 StopBenchmarkTiming();
317 close(pstore_fd);
318}
319BENCHMARK(BM_pmsg_short_unaligned1);
320
321/*
322 * Measure the time it takes to submit the android logging data to pstore
323 * best case aligned single block.
324 */
325static void BM_pmsg_long_aligned(int iters) {
326
327 int pstore_fd = TEMP_FAILURE_RETRY(open("/dev/pmsg0", O_WRONLY));
328 if (pstore_fd < 0) {
329 return;
330 }
331
332 /*
333 * struct {
334 * // what we provide to pstore
335 * android_pmsg_log_header_t pmsg_header;
336 * // what we provide to socket
337 * android_log_header_t header;
338 * // caller provides
339 * union {
340 * struct {
341 * char prio;
342 * char payload[];
343 * } string;
344 * struct {
345 * uint32_t tag
346 * char payload[];
347 * } binary;
348 * };
349 * };
350 */
351
352 struct timespec ts;
353 clock_gettime(android_log_clockid(), &ts);
354
355 struct packet {
356 android_pmsg_log_header_t pmsg_header;
357 android_log_header_t header;
358 android_log_event_int_t payload;
359 };
Elliott Hughes5f4a9462016-06-06 19:56:24 -0700360 alignas(8) char buf[sizeof(struct packet) + 8 + LOGGER_ENTRY_MAX_PAYLOAD];
Mark Salyzyn163ebdc2015-12-16 13:11:36 -0800361 memset(buf, 0, sizeof(buf));
362 struct packet *buffer = (struct packet*)(((uintptr_t)buf + 7) & ~7);
363 if (((uintptr_t)&buffer->pmsg_header) & 7) {
364 fprintf (stderr, "&buffer=0x%p iters=%d\n", &buffer->pmsg_header, iters);
365 }
366
367 buffer->pmsg_header.magic = LOGGER_MAGIC;
368 buffer->pmsg_header.len = sizeof(android_pmsg_log_header_t)
369 + sizeof(android_log_header_t);
370 buffer->pmsg_header.uid = getuid();
371 buffer->pmsg_header.pid = getpid();
372
373 buffer->header.tid = gettid();
374 buffer->header.realtime.tv_sec = ts.tv_sec;
375 buffer->header.realtime.tv_nsec = ts.tv_nsec;
376
377 buffer->header.id = LOG_ID_EVENTS;
378 buffer->payload.header.tag = 0;
379 buffer->payload.payload.type = EVENT_TYPE_INT;
380 uint32_t snapshot = 0;
381 buffer->payload.payload.data = htole32(snapshot);
382
383 StartBenchmarkTiming();
384 for (int i = 0; i < iters; ++i) {
385 ++snapshot;
386 buffer->payload.payload.data = htole32(snapshot);
387 write(pstore_fd, &buffer->pmsg_header, LOGGER_ENTRY_MAX_PAYLOAD);
388 }
389 StopBenchmarkTiming();
390 close(pstore_fd);
391}
392BENCHMARK(BM_pmsg_long_aligned);
393
394/*
395 * Measure the time it takes to submit the android logging data to pstore
396 * best case aligned single block.
397 */
398static void BM_pmsg_long_unaligned1(int iters) {
399
400 int pstore_fd = TEMP_FAILURE_RETRY(open("/dev/pmsg0", O_WRONLY));
401 if (pstore_fd < 0) {
402 return;
403 }
404
405 /*
406 * struct {
407 * // what we provide to pstore
408 * android_pmsg_log_header_t pmsg_header;
409 * // what we provide to socket
410 * android_log_header_t header;
411 * // caller provides
412 * union {
413 * struct {
414 * char prio;
415 * char payload[];
416 * } string;
417 * struct {
418 * uint32_t tag
419 * char payload[];
420 * } binary;
421 * };
422 * };
423 */
424
425 struct timespec ts;
426 clock_gettime(android_log_clockid(), &ts);
427
428 struct packet {
429 android_pmsg_log_header_t pmsg_header;
430 android_log_header_t header;
431 android_log_event_int_t payload;
432 };
Elliott Hughes5f4a9462016-06-06 19:56:24 -0700433 alignas(8) char buf[sizeof(struct packet) + 8 + LOGGER_ENTRY_MAX_PAYLOAD];
Mark Salyzyn163ebdc2015-12-16 13:11:36 -0800434 memset(buf, 0, sizeof(buf));
435 struct packet *buffer = (struct packet*)((((uintptr_t)buf + 7) & ~7) + 1);
436 if ((((uintptr_t)&buffer->pmsg_header) & 7) != 1) {
437 fprintf (stderr, "&buffer=0x%p iters=%d\n", &buffer->pmsg_header, iters);
438 }
439
440 buffer->pmsg_header.magic = LOGGER_MAGIC;
441 buffer->pmsg_header.len = sizeof(android_pmsg_log_header_t)
442 + sizeof(android_log_header_t);
443 buffer->pmsg_header.uid = getuid();
444 buffer->pmsg_header.pid = getpid();
445
446 buffer->header.tid = gettid();
447 buffer->header.realtime.tv_sec = ts.tv_sec;
448 buffer->header.realtime.tv_nsec = ts.tv_nsec;
449
450 buffer->header.id = LOG_ID_EVENTS;
451 buffer->payload.header.tag = 0;
452 buffer->payload.payload.type = EVENT_TYPE_INT;
453 uint32_t snapshot = 0;
454 buffer->payload.payload.data = htole32(snapshot);
455
456 StartBenchmarkTiming();
457 for (int i = 0; i < iters; ++i) {
458 ++snapshot;
459 buffer->payload.payload.data = htole32(snapshot);
460 write(pstore_fd, &buffer->pmsg_header, LOGGER_ENTRY_MAX_PAYLOAD);
461 }
462 StopBenchmarkTiming();
463 close(pstore_fd);
464}
465BENCHMARK(BM_pmsg_long_unaligned1);
466
467/*
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800468 * Measure the time it takes to submit the android logging call using
469 * discrete acquisition under light load. Expect this to be a dozen or so
470 * syscall periods (40us).
471 */
472static void BM_log_overhead(int iters) {
473 for (int i = 0; i < iters; ++i) {
474 StartBenchmarkTiming();
475 __android_log_print(ANDROID_LOG_INFO, "BM_log_overhead", "%d", i);
476 StopBenchmarkTiming();
477 usleep(1000);
478 }
479}
480BENCHMARK(BM_log_overhead);
481
Mark Salyzyna04464a2014-04-30 08:50:53 -0700482static void caught_latency(int /*signum*/)
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800483{
484 unsigned long long v = 0xDEADBEEFA55A5AA5ULL;
485
486 LOG_FAILURE_RETRY(__android_log_btwrite(0, EVENT_TYPE_LONG, &v, sizeof(v)));
487}
488
489static unsigned long long caught_convert(char *cp)
490{
491 unsigned long long l = cp[0] & 0xFF;
492 l |= (unsigned long long) (cp[1] & 0xFF) << 8;
493 l |= (unsigned long long) (cp[2] & 0xFF) << 16;
494 l |= (unsigned long long) (cp[3] & 0xFF) << 24;
495 l |= (unsigned long long) (cp[4] & 0xFF) << 32;
496 l |= (unsigned long long) (cp[5] & 0xFF) << 40;
497 l |= (unsigned long long) (cp[6] & 0xFF) << 48;
498 l |= (unsigned long long) (cp[7] & 0xFF) << 56;
499 return l;
500}
501
502static const int alarm_time = 3;
503
504/*
505 * Measure the time it takes for the logd posting call to acquire the
506 * timestamp to place into the internal record. Expect this to be less than
507 * 4 syscalls (3us).
508 */
509static void BM_log_latency(int iters) {
510 pid_t pid = getpid();
511
512 struct logger_list * logger_list = android_logger_list_open(LOG_ID_EVENTS,
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800513 ANDROID_LOG_RDONLY, 0, pid);
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800514
515 if (!logger_list) {
516 fprintf(stderr, "Unable to open events log: %s\n", strerror(errno));
517 exit(EXIT_FAILURE);
518 }
519
520 signal(SIGALRM, caught_latency);
521 alarm(alarm_time);
522
523 for (int j = 0, i = 0; i < iters && j < 10*iters; ++i, ++j) {
524 log_time ts;
525 LOG_FAILURE_RETRY((
Mark Salyzyn7e2f83c2014-03-05 07:41:49 -0800526 ts = log_time(CLOCK_REALTIME),
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800527 android_btWriteLog(0, EVENT_TYPE_LONG, &ts, sizeof(ts))));
528
529 for (;;) {
530 log_msg log_msg;
531 int ret = android_logger_list_read(logger_list, &log_msg);
532 alarm(alarm_time);
533
534 if (ret <= 0) {
535 iters = i;
536 break;
537 }
538 if ((log_msg.entry.len != (4 + 1 + 8))
539 || (log_msg.id() != LOG_ID_EVENTS)) {
540 continue;
541 }
542
543 char* eventData = log_msg.msg();
544
545 if (eventData[4] != EVENT_TYPE_LONG) {
546 continue;
547 }
548 log_time tx(eventData + 4 + 1);
549 if (ts != tx) {
550 if (0xDEADBEEFA55A5AA5ULL == caught_convert(eventData + 4 + 1)) {
551 iters = i;
552 break;
553 }
554 continue;
555 }
556
557 uint64_t start = ts.nsec();
558 uint64_t end = log_msg.nsec();
559 if (end >= start) {
560 StartBenchmarkTiming(start);
561 StopBenchmarkTiming(end);
562 } else {
563 --i;
564 }
565 break;
566 }
567 }
568
569 signal(SIGALRM, SIG_DFL);
570 alarm(0);
571
572 android_logger_list_free(logger_list);
573}
574BENCHMARK(BM_log_latency);
575
Mark Salyzyna04464a2014-04-30 08:50:53 -0700576static void caught_delay(int /*signum*/)
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800577{
578 unsigned long long v = 0xDEADBEEFA55A5AA6ULL;
579
580 LOG_FAILURE_RETRY(__android_log_btwrite(0, EVENT_TYPE_LONG, &v, sizeof(v)));
581}
582
583/*
584 * Measure the time it takes for the logd posting call to make it into
585 * the logs. Expect this to be less than double the process wakeup time (2ms).
586 */
587static void BM_log_delay(int iters) {
588 pid_t pid = getpid();
589
590 struct logger_list * logger_list = android_logger_list_open(LOG_ID_EVENTS,
Mark Salyzyn2d3f38a2015-01-26 10:46:44 -0800591 ANDROID_LOG_RDONLY, 0, pid);
Mark Salyzyn819c58a2013-11-22 12:39:43 -0800592
593 if (!logger_list) {
594 fprintf(stderr, "Unable to open events log: %s\n", strerror(errno));
595 exit(EXIT_FAILURE);
596 }
597
598 signal(SIGALRM, caught_delay);
599 alarm(alarm_time);
600
601 StartBenchmarkTiming();
602
603 for (int i = 0; i < iters; ++i) {
604 log_time ts(CLOCK_REALTIME);
605
606 LOG_FAILURE_RETRY(
607 android_btWriteLog(0, EVENT_TYPE_LONG, &ts, sizeof(ts)));
608
609 for (;;) {
610 log_msg log_msg;
611 int ret = android_logger_list_read(logger_list, &log_msg);
612 alarm(alarm_time);
613
614 if (ret <= 0) {
615 iters = i;
616 break;
617 }
618 if ((log_msg.entry.len != (4 + 1 + 8))
619 || (log_msg.id() != LOG_ID_EVENTS)) {
620 continue;
621 }
622
623 char* eventData = log_msg.msg();
624
625 if (eventData[4] != EVENT_TYPE_LONG) {
626 continue;
627 }
628 log_time tx(eventData + 4 + 1);
629 if (ts != tx) {
630 if (0xDEADBEEFA55A5AA6ULL == caught_convert(eventData + 4 + 1)) {
631 iters = i;
632 break;
633 }
634 continue;
635 }
636
637 break;
638 }
639 }
640
641 signal(SIGALRM, SIG_DFL);
642 alarm(0);
643
644 StopBenchmarkTiming();
645
646 android_logger_list_free(logger_list);
647}
648BENCHMARK(BM_log_delay);
Mark Salyzyn1ac79cb2015-04-23 15:08:11 -0700649
650/*
651 * Measure the time it takes for __android_log_is_loggable.
652 */
653static void BM_is_loggable(int iters) {
654 StartBenchmarkTiming();
655
656 for (int i = 0; i < iters; ++i) {
657 __android_log_is_loggable(ANDROID_LOG_WARN, "logd", ANDROID_LOG_VERBOSE);
658 }
659
660 StopBenchmarkTiming();
661}
662BENCHMARK(BM_is_loggable);
Mark Salyzyna67d8a52015-12-21 12:32:48 -0800663
664/*
665 * Measure the time it takes for android_log_clockid.
666 */
667static void BM_clockid(int iters) {
668 StartBenchmarkTiming();
669
670 for (int i = 0; i < iters; ++i) {
671 android_log_clockid();
672 }
673
674 StopBenchmarkTiming();
675}
676BENCHMARK(BM_clockid);
677
678/*
679 * Measure the time it takes for __android_log_security.
680 */
681static void BM_security(int iters) {
682 StartBenchmarkTiming();
683
684 for (int i = 0; i < iters; ++i) {
685 __android_log_security();
686 }
687
688 StopBenchmarkTiming();
689}
690BENCHMARK(BM_security);