blob: 856f1502e1bce7c7ec2b62c6179df78bde240eb6 [file] [log] [blame]
Elliott Hughesb28e4902014-03-11 11:19:06 -07001/*
2 * Copyright (C) 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
Elliott Hughesb28e4902014-03-11 11:19:06 -070017#include <pthread.h>
18
Elliott Hughes281e06b2016-02-17 10:23:52 -080019#include <benchmark/benchmark.h>
Anders Lewisa7b0f882017-07-24 20:01:13 -070020#include "util.h"
Christopher Ferrisdf4942c2015-02-17 19:58:53 -080021
Elliott Hughesb27a8402014-06-10 20:47:49 -070022// Stop GCC optimizing out our pure function.
23/* Must not be static! */ pthread_t (*pthread_self_fp)() = pthread_self;
24
Elliott Hughes281e06b2016-02-17 10:23:52 -080025static void BM_pthread_self(benchmark::State& state) {
26 while (state.KeepRunning()) {
Elliott Hughesb27a8402014-06-10 20:47:49 -070027 pthread_self_fp();
Elliott Hughesb28e4902014-03-11 11:19:06 -070028 }
Elliott Hughesb28e4902014-03-11 11:19:06 -070029}
Anders Lewisa7b0f882017-07-24 20:01:13 -070030BIONIC_BENCHMARK(BM_pthread_self);
Elliott Hughesb28e4902014-03-11 11:19:06 -070031
Elliott Hughes281e06b2016-02-17 10:23:52 -080032static void BM_pthread_getspecific(benchmark::State& state) {
Elliott Hughesb28e4902014-03-11 11:19:06 -070033 pthread_key_t key;
Yi Kong32bc0fc2018-08-02 17:31:13 -070034 pthread_key_create(&key, nullptr);
Elliott Hughesb28e4902014-03-11 11:19:06 -070035
Elliott Hughes281e06b2016-02-17 10:23:52 -080036 while (state.KeepRunning()) {
Elliott Hughesb28e4902014-03-11 11:19:06 -070037 pthread_getspecific(key);
38 }
39
Elliott Hughesb28e4902014-03-11 11:19:06 -070040 pthread_key_delete(key);
41}
Anders Lewisa7b0f882017-07-24 20:01:13 -070042BIONIC_BENCHMARK(BM_pthread_getspecific);
Elliott Hughesb28e4902014-03-11 11:19:06 -070043
Elliott Hughes281e06b2016-02-17 10:23:52 -080044static void BM_pthread_setspecific(benchmark::State& state) {
Yabin Cui8cf1b302014-12-03 21:36:24 -080045 pthread_key_t key;
Yi Kong32bc0fc2018-08-02 17:31:13 -070046 pthread_key_create(&key, nullptr);
Yabin Cui8cf1b302014-12-03 21:36:24 -080047
Elliott Hughes281e06b2016-02-17 10:23:52 -080048 while (state.KeepRunning()) {
Yi Kong32bc0fc2018-08-02 17:31:13 -070049 pthread_setspecific(key, nullptr);
Yabin Cui8cf1b302014-12-03 21:36:24 -080050 }
51
Yabin Cui8cf1b302014-12-03 21:36:24 -080052 pthread_key_delete(key);
53}
Anders Lewisa7b0f882017-07-24 20:01:13 -070054BIONIC_BENCHMARK(BM_pthread_setspecific);
Yabin Cui8cf1b302014-12-03 21:36:24 -080055
Elliott Hughes68ae6ad2020-07-21 16:11:30 -070056static void NoOpPthreadOnceInitFunction() {}
Elliott Hughesb28e4902014-03-11 11:19:06 -070057
Elliott Hughes281e06b2016-02-17 10:23:52 -080058static void BM_pthread_once(benchmark::State& state) {
George Burgess IV70591002017-06-27 16:23:45 -070059 static pthread_once_t once = PTHREAD_ONCE_INIT;
Elliott Hughes68ae6ad2020-07-21 16:11:30 -070060 pthread_once(&once, NoOpPthreadOnceInitFunction);
Elliott Hughesb28e4902014-03-11 11:19:06 -070061
Elliott Hughes281e06b2016-02-17 10:23:52 -080062 while (state.KeepRunning()) {
Elliott Hughes68ae6ad2020-07-21 16:11:30 -070063 pthread_once(&once, NoOpPthreadOnceInitFunction);
Elliott Hughesb28e4902014-03-11 11:19:06 -070064 }
Elliott Hughesb28e4902014-03-11 11:19:06 -070065}
Anders Lewisa7b0f882017-07-24 20:01:13 -070066BIONIC_BENCHMARK(BM_pthread_once);
Elliott Hughesb28e4902014-03-11 11:19:06 -070067
Elliott Hughes281e06b2016-02-17 10:23:52 -080068static void BM_pthread_mutex_lock(benchmark::State& state) {
Elliott Hughesb28e4902014-03-11 11:19:06 -070069 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
Elliott Hughesb28e4902014-03-11 11:19:06 -070070
Elliott Hughes281e06b2016-02-17 10:23:52 -080071 while (state.KeepRunning()) {
Elliott Hughesb28e4902014-03-11 11:19:06 -070072 pthread_mutex_lock(&mutex);
73 pthread_mutex_unlock(&mutex);
74 }
Elliott Hughesb28e4902014-03-11 11:19:06 -070075}
Anders Lewisa7b0f882017-07-24 20:01:13 -070076BIONIC_BENCHMARK(BM_pthread_mutex_lock);
Elliott Hughesb28e4902014-03-11 11:19:06 -070077
Elliott Hughes281e06b2016-02-17 10:23:52 -080078static void BM_pthread_mutex_lock_ERRORCHECK(benchmark::State& state) {
Elliott Hughes212e0e32014-12-01 16:43:51 -080079 pthread_mutex_t mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
Elliott Hughesb28e4902014-03-11 11:19:06 -070080
Elliott Hughes281e06b2016-02-17 10:23:52 -080081 while (state.KeepRunning()) {
Elliott Hughesb28e4902014-03-11 11:19:06 -070082 pthread_mutex_lock(&mutex);
83 pthread_mutex_unlock(&mutex);
84 }
Elliott Hughesb28e4902014-03-11 11:19:06 -070085}
Anders Lewisa7b0f882017-07-24 20:01:13 -070086BIONIC_BENCHMARK(BM_pthread_mutex_lock_ERRORCHECK);
Elliott Hughesb28e4902014-03-11 11:19:06 -070087
Elliott Hughes281e06b2016-02-17 10:23:52 -080088static void BM_pthread_mutex_lock_RECURSIVE(benchmark::State& state) {
Elliott Hughes212e0e32014-12-01 16:43:51 -080089 pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
Elliott Hughesb28e4902014-03-11 11:19:06 -070090
Elliott Hughes281e06b2016-02-17 10:23:52 -080091 while (state.KeepRunning()) {
Elliott Hughesb28e4902014-03-11 11:19:06 -070092 pthread_mutex_lock(&mutex);
93 pthread_mutex_unlock(&mutex);
94 }
Elliott Hughesb28e4902014-03-11 11:19:06 -070095}
Anders Lewisa7b0f882017-07-24 20:01:13 -070096BIONIC_BENCHMARK(BM_pthread_mutex_lock_RECURSIVE);
Calin Juravle837a9622014-09-16 18:01:44 +010097
Yabin Cui6b9c85b2018-01-23 12:56:18 -080098namespace {
99struct PIMutex {
100 pthread_mutex_t mutex;
101
Chih-Hung Hsieh770032d2019-01-02 10:59:48 -0800102 explicit PIMutex(int type) {
Yabin Cui6b9c85b2018-01-23 12:56:18 -0800103 pthread_mutexattr_t attr;
104 pthread_mutexattr_init(&attr);
105 pthread_mutexattr_settype(&attr, type);
106 pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT);
107 pthread_mutex_init(&mutex, &attr);
108 pthread_mutexattr_destroy(&attr);
109 }
110
111 ~PIMutex() {
112 pthread_mutex_destroy(&mutex);
113 }
114};
115}
116
117static void BM_pthread_mutex_lock_PI(benchmark::State& state) {
118 PIMutex m(PTHREAD_MUTEX_NORMAL);
119
120 while (state.KeepRunning()) {
121 pthread_mutex_lock(&m.mutex);
122 pthread_mutex_unlock(&m.mutex);
123 }
124}
125BIONIC_BENCHMARK(BM_pthread_mutex_lock_PI);
126
127static void BM_pthread_mutex_lock_ERRORCHECK_PI(benchmark::State& state) {
128 PIMutex m(PTHREAD_MUTEX_ERRORCHECK);
129
130 while (state.KeepRunning()) {
131 pthread_mutex_lock(&m.mutex);
132 pthread_mutex_unlock(&m.mutex);
133 }
134}
135BIONIC_BENCHMARK(BM_pthread_mutex_lock_ERRORCHECK_PI);
136
137static void BM_pthread_mutex_lock_RECURSIVE_PI(benchmark::State& state) {
138 PIMutex m(PTHREAD_MUTEX_RECURSIVE);
139
140 while (state.KeepRunning()) {
141 pthread_mutex_lock(&m.mutex);
142 pthread_mutex_unlock(&m.mutex);
143 }
144}
145BIONIC_BENCHMARK(BM_pthread_mutex_lock_RECURSIVE_PI);
Yabin Cui6b9c85b2018-01-23 12:56:18 -0800146
Elliott Hughes281e06b2016-02-17 10:23:52 -0800147static void BM_pthread_rwlock_read(benchmark::State& state) {
Calin Juravle837a9622014-09-16 18:01:44 +0100148 pthread_rwlock_t lock;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700149 pthread_rwlock_init(&lock, nullptr);
Calin Juravle837a9622014-09-16 18:01:44 +0100150
Elliott Hughes281e06b2016-02-17 10:23:52 -0800151 while (state.KeepRunning()) {
Calin Juravle837a9622014-09-16 18:01:44 +0100152 pthread_rwlock_rdlock(&lock);
153 pthread_rwlock_unlock(&lock);
154 }
155
Calin Juravle837a9622014-09-16 18:01:44 +0100156 pthread_rwlock_destroy(&lock);
157}
Anders Lewisa7b0f882017-07-24 20:01:13 -0700158BIONIC_BENCHMARK(BM_pthread_rwlock_read);
Calin Juravle837a9622014-09-16 18:01:44 +0100159
Elliott Hughes281e06b2016-02-17 10:23:52 -0800160static void BM_pthread_rwlock_write(benchmark::State& state) {
Calin Juravle837a9622014-09-16 18:01:44 +0100161 pthread_rwlock_t lock;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700162 pthread_rwlock_init(&lock, nullptr);
Calin Juravle837a9622014-09-16 18:01:44 +0100163
Elliott Hughes281e06b2016-02-17 10:23:52 -0800164 while (state.KeepRunning()) {
Calin Juravle837a9622014-09-16 18:01:44 +0100165 pthread_rwlock_wrlock(&lock);
166 pthread_rwlock_unlock(&lock);
167 }
168
Calin Juravle837a9622014-09-16 18:01:44 +0100169 pthread_rwlock_destroy(&lock);
170}
Anders Lewisa7b0f882017-07-24 20:01:13 -0700171BIONIC_BENCHMARK(BM_pthread_rwlock_write);
Yabin Cui8cf1b302014-12-03 21:36:24 -0800172
173static void* IdleThread(void*) {
Yi Kong32bc0fc2018-08-02 17:31:13 -0700174 return nullptr;
Yabin Cui8cf1b302014-12-03 21:36:24 -0800175}
176
Elliott Hughes281e06b2016-02-17 10:23:52 -0800177static void BM_pthread_create(benchmark::State& state) {
178 while (state.KeepRunning()) {
179 pthread_t thread;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700180 pthread_create(&thread, nullptr, IdleThread, nullptr);
Elliott Hughes281e06b2016-02-17 10:23:52 -0800181 state.PauseTiming();
Yi Kong32bc0fc2018-08-02 17:31:13 -0700182 pthread_join(thread, nullptr);
Elliott Hughes281e06b2016-02-17 10:23:52 -0800183 state.ResumeTiming();
Yabin Cui8cf1b302014-12-03 21:36:24 -0800184 }
185}
Anders Lewisa7b0f882017-07-24 20:01:13 -0700186BIONIC_BENCHMARK(BM_pthread_create);
Yabin Cui8cf1b302014-12-03 21:36:24 -0800187
Josh Gao286b3a82017-10-24 14:00:09 -0700188static void* RunThread(void*) {
Yi Kong32bc0fc2018-08-02 17:31:13 -0700189 return nullptr;
Yabin Cui8cf1b302014-12-03 21:36:24 -0800190}
191
Elliott Hughes281e06b2016-02-17 10:23:52 -0800192static void BM_pthread_create_and_run(benchmark::State& state) {
193 while (state.KeepRunning()) {
194 pthread_t thread;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700195 pthread_create(&thread, nullptr, RunThread, &state);
196 pthread_join(thread, nullptr);
Yabin Cui8cf1b302014-12-03 21:36:24 -0800197 }
198}
Anders Lewisa7b0f882017-07-24 20:01:13 -0700199BIONIC_BENCHMARK(BM_pthread_create_and_run);
Yabin Cui8cf1b302014-12-03 21:36:24 -0800200
Josh Gao286b3a82017-10-24 14:00:09 -0700201static void* ExitThread(void*) {
Yi Kong32bc0fc2018-08-02 17:31:13 -0700202 pthread_exit(nullptr);
Yabin Cui8cf1b302014-12-03 21:36:24 -0800203}
204
Elliott Hughes281e06b2016-02-17 10:23:52 -0800205static void BM_pthread_exit_and_join(benchmark::State& state) {
206 while (state.KeepRunning()) {
Elliott Hughes281e06b2016-02-17 10:23:52 -0800207 pthread_t thread;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700208 pthread_create(&thread, nullptr, ExitThread, nullptr);
209 pthread_join(thread, nullptr);
Yabin Cui8cf1b302014-12-03 21:36:24 -0800210 }
211}
Anders Lewisa7b0f882017-07-24 20:01:13 -0700212BIONIC_BENCHMARK(BM_pthread_exit_and_join);
Yabin Cui8cf1b302014-12-03 21:36:24 -0800213
Elliott Hughes281e06b2016-02-17 10:23:52 -0800214static void BM_pthread_key_create(benchmark::State& state) {
215 while (state.KeepRunning()) {
216 pthread_key_t key;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700217 pthread_key_create(&key, nullptr);
Elliott Hughes281e06b2016-02-17 10:23:52 -0800218
219 state.PauseTiming();
220 pthread_key_delete(key);
221 state.ResumeTiming();
222 }
223}
Anders Lewisa7b0f882017-07-24 20:01:13 -0700224BIONIC_BENCHMARK(BM_pthread_key_create);
Elliott Hughes281e06b2016-02-17 10:23:52 -0800225
226static void BM_pthread_key_delete(benchmark::State& state) {
227 while (state.KeepRunning()) {
228 state.PauseTiming();
229 pthread_key_t key;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700230 pthread_key_create(&key, nullptr);
Elliott Hughes281e06b2016-02-17 10:23:52 -0800231 state.ResumeTiming();
232
Yabin Cui8cf1b302014-12-03 21:36:24 -0800233 pthread_key_delete(key);
234 }
235}
Anders Lewisa7b0f882017-07-24 20:01:13 -0700236BIONIC_BENCHMARK(BM_pthread_key_delete);