blob: 09654c825183039c9a5228c83b2da72d35fbbbde [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 Hughesb28e4902014-03-11 11:19:06 -070056static void DummyPthreadOnceInitFunction() {
57}
58
Elliott Hughes281e06b2016-02-17 10:23:52 -080059static void BM_pthread_once(benchmark::State& state) {
George Burgess IV70591002017-06-27 16:23:45 -070060 static pthread_once_t once = PTHREAD_ONCE_INIT;
Elliott Hughesb28e4902014-03-11 11:19:06 -070061 pthread_once(&once, DummyPthreadOnceInitFunction);
Elliott Hughesb28e4902014-03-11 11:19:06 -070062
Elliott Hughes281e06b2016-02-17 10:23:52 -080063 while (state.KeepRunning()) {
Elliott Hughesb28e4902014-03-11 11:19:06 -070064 pthread_once(&once, DummyPthreadOnceInitFunction);
65 }
Elliott Hughesb28e4902014-03-11 11:19:06 -070066}
Anders Lewisa7b0f882017-07-24 20:01:13 -070067BIONIC_BENCHMARK(BM_pthread_once);
Elliott Hughesb28e4902014-03-11 11:19:06 -070068
Elliott Hughes281e06b2016-02-17 10:23:52 -080069static void BM_pthread_mutex_lock(benchmark::State& state) {
Elliott Hughesb28e4902014-03-11 11:19:06 -070070 pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
Elliott Hughesb28e4902014-03-11 11:19:06 -070071
Elliott Hughes281e06b2016-02-17 10:23:52 -080072 while (state.KeepRunning()) {
Elliott Hughesb28e4902014-03-11 11:19:06 -070073 pthread_mutex_lock(&mutex);
74 pthread_mutex_unlock(&mutex);
75 }
Elliott Hughesb28e4902014-03-11 11:19:06 -070076}
Anders Lewisa7b0f882017-07-24 20:01:13 -070077BIONIC_BENCHMARK(BM_pthread_mutex_lock);
Elliott Hughesb28e4902014-03-11 11:19:06 -070078
Elliott Hughes281e06b2016-02-17 10:23:52 -080079static void BM_pthread_mutex_lock_ERRORCHECK(benchmark::State& state) {
Elliott Hughes212e0e32014-12-01 16:43:51 -080080 pthread_mutex_t mutex = PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP;
Elliott Hughesb28e4902014-03-11 11:19:06 -070081
Elliott Hughes281e06b2016-02-17 10:23:52 -080082 while (state.KeepRunning()) {
Elliott Hughesb28e4902014-03-11 11:19:06 -070083 pthread_mutex_lock(&mutex);
84 pthread_mutex_unlock(&mutex);
85 }
Elliott Hughesb28e4902014-03-11 11:19:06 -070086}
Anders Lewisa7b0f882017-07-24 20:01:13 -070087BIONIC_BENCHMARK(BM_pthread_mutex_lock_ERRORCHECK);
Elliott Hughesb28e4902014-03-11 11:19:06 -070088
Elliott Hughes281e06b2016-02-17 10:23:52 -080089static void BM_pthread_mutex_lock_RECURSIVE(benchmark::State& state) {
Elliott Hughes212e0e32014-12-01 16:43:51 -080090 pthread_mutex_t mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
Elliott Hughesb28e4902014-03-11 11:19:06 -070091
Elliott Hughes281e06b2016-02-17 10:23:52 -080092 while (state.KeepRunning()) {
Elliott Hughesb28e4902014-03-11 11:19:06 -070093 pthread_mutex_lock(&mutex);
94 pthread_mutex_unlock(&mutex);
95 }
Elliott Hughesb28e4902014-03-11 11:19:06 -070096}
Anders Lewisa7b0f882017-07-24 20:01:13 -070097BIONIC_BENCHMARK(BM_pthread_mutex_lock_RECURSIVE);
Calin Juravle837a9622014-09-16 18:01:44 +010098
Yabin Cui6b9c85b2018-01-23 12:56:18 -080099namespace {
100struct PIMutex {
101 pthread_mutex_t mutex;
102
103 PIMutex(int type) {
104 pthread_mutexattr_t attr;
105 pthread_mutexattr_init(&attr);
106 pthread_mutexattr_settype(&attr, type);
107 pthread_mutexattr_setprotocol(&attr, PTHREAD_PRIO_INHERIT);
108 pthread_mutex_init(&mutex, &attr);
109 pthread_mutexattr_destroy(&attr);
110 }
111
112 ~PIMutex() {
113 pthread_mutex_destroy(&mutex);
114 }
115};
116}
117
118static void BM_pthread_mutex_lock_PI(benchmark::State& state) {
119 PIMutex m(PTHREAD_MUTEX_NORMAL);
120
121 while (state.KeepRunning()) {
122 pthread_mutex_lock(&m.mutex);
123 pthread_mutex_unlock(&m.mutex);
124 }
125}
126BIONIC_BENCHMARK(BM_pthread_mutex_lock_PI);
127
128static void BM_pthread_mutex_lock_ERRORCHECK_PI(benchmark::State& state) {
129 PIMutex m(PTHREAD_MUTEX_ERRORCHECK);
130
131 while (state.KeepRunning()) {
132 pthread_mutex_lock(&m.mutex);
133 pthread_mutex_unlock(&m.mutex);
134 }
135}
136BIONIC_BENCHMARK(BM_pthread_mutex_lock_ERRORCHECK_PI);
137
138static void BM_pthread_mutex_lock_RECURSIVE_PI(benchmark::State& state) {
139 PIMutex m(PTHREAD_MUTEX_RECURSIVE);
140
141 while (state.KeepRunning()) {
142 pthread_mutex_lock(&m.mutex);
143 pthread_mutex_unlock(&m.mutex);
144 }
145}
146BIONIC_BENCHMARK(BM_pthread_mutex_lock_RECURSIVE_PI);
Yabin Cui6b9c85b2018-01-23 12:56:18 -0800147
Elliott Hughes281e06b2016-02-17 10:23:52 -0800148static void BM_pthread_rwlock_read(benchmark::State& state) {
Calin Juravle837a9622014-09-16 18:01:44 +0100149 pthread_rwlock_t lock;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700150 pthread_rwlock_init(&lock, nullptr);
Calin Juravle837a9622014-09-16 18:01:44 +0100151
Elliott Hughes281e06b2016-02-17 10:23:52 -0800152 while (state.KeepRunning()) {
Calin Juravle837a9622014-09-16 18:01:44 +0100153 pthread_rwlock_rdlock(&lock);
154 pthread_rwlock_unlock(&lock);
155 }
156
Calin Juravle837a9622014-09-16 18:01:44 +0100157 pthread_rwlock_destroy(&lock);
158}
Anders Lewisa7b0f882017-07-24 20:01:13 -0700159BIONIC_BENCHMARK(BM_pthread_rwlock_read);
Calin Juravle837a9622014-09-16 18:01:44 +0100160
Elliott Hughes281e06b2016-02-17 10:23:52 -0800161static void BM_pthread_rwlock_write(benchmark::State& state) {
Calin Juravle837a9622014-09-16 18:01:44 +0100162 pthread_rwlock_t lock;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700163 pthread_rwlock_init(&lock, nullptr);
Calin Juravle837a9622014-09-16 18:01:44 +0100164
Elliott Hughes281e06b2016-02-17 10:23:52 -0800165 while (state.KeepRunning()) {
Calin Juravle837a9622014-09-16 18:01:44 +0100166 pthread_rwlock_wrlock(&lock);
167 pthread_rwlock_unlock(&lock);
168 }
169
Calin Juravle837a9622014-09-16 18:01:44 +0100170 pthread_rwlock_destroy(&lock);
171}
Anders Lewisa7b0f882017-07-24 20:01:13 -0700172BIONIC_BENCHMARK(BM_pthread_rwlock_write);
Yabin Cui8cf1b302014-12-03 21:36:24 -0800173
174static void* IdleThread(void*) {
Yi Kong32bc0fc2018-08-02 17:31:13 -0700175 return nullptr;
Yabin Cui8cf1b302014-12-03 21:36:24 -0800176}
177
Elliott Hughes281e06b2016-02-17 10:23:52 -0800178static void BM_pthread_create(benchmark::State& state) {
179 while (state.KeepRunning()) {
180 pthread_t thread;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700181 pthread_create(&thread, nullptr, IdleThread, nullptr);
Elliott Hughes281e06b2016-02-17 10:23:52 -0800182 state.PauseTiming();
Yi Kong32bc0fc2018-08-02 17:31:13 -0700183 pthread_join(thread, nullptr);
Elliott Hughes281e06b2016-02-17 10:23:52 -0800184 state.ResumeTiming();
Yabin Cui8cf1b302014-12-03 21:36:24 -0800185 }
186}
Anders Lewisa7b0f882017-07-24 20:01:13 -0700187BIONIC_BENCHMARK(BM_pthread_create);
Yabin Cui8cf1b302014-12-03 21:36:24 -0800188
Josh Gao286b3a82017-10-24 14:00:09 -0700189static void* RunThread(void*) {
Yi Kong32bc0fc2018-08-02 17:31:13 -0700190 return nullptr;
Yabin Cui8cf1b302014-12-03 21:36:24 -0800191}
192
Elliott Hughes281e06b2016-02-17 10:23:52 -0800193static void BM_pthread_create_and_run(benchmark::State& state) {
194 while (state.KeepRunning()) {
195 pthread_t thread;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700196 pthread_create(&thread, nullptr, RunThread, &state);
197 pthread_join(thread, nullptr);
Yabin Cui8cf1b302014-12-03 21:36:24 -0800198 }
199}
Anders Lewisa7b0f882017-07-24 20:01:13 -0700200BIONIC_BENCHMARK(BM_pthread_create_and_run);
Yabin Cui8cf1b302014-12-03 21:36:24 -0800201
Josh Gao286b3a82017-10-24 14:00:09 -0700202static void* ExitThread(void*) {
Yi Kong32bc0fc2018-08-02 17:31:13 -0700203 pthread_exit(nullptr);
Yabin Cui8cf1b302014-12-03 21:36:24 -0800204}
205
Elliott Hughes281e06b2016-02-17 10:23:52 -0800206static void BM_pthread_exit_and_join(benchmark::State& state) {
207 while (state.KeepRunning()) {
Elliott Hughes281e06b2016-02-17 10:23:52 -0800208 pthread_t thread;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700209 pthread_create(&thread, nullptr, ExitThread, nullptr);
210 pthread_join(thread, nullptr);
Yabin Cui8cf1b302014-12-03 21:36:24 -0800211 }
212}
Anders Lewisa7b0f882017-07-24 20:01:13 -0700213BIONIC_BENCHMARK(BM_pthread_exit_and_join);
Yabin Cui8cf1b302014-12-03 21:36:24 -0800214
Elliott Hughes281e06b2016-02-17 10:23:52 -0800215static void BM_pthread_key_create(benchmark::State& state) {
216 while (state.KeepRunning()) {
217 pthread_key_t key;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700218 pthread_key_create(&key, nullptr);
Elliott Hughes281e06b2016-02-17 10:23:52 -0800219
220 state.PauseTiming();
221 pthread_key_delete(key);
222 state.ResumeTiming();
223 }
224}
Anders Lewisa7b0f882017-07-24 20:01:13 -0700225BIONIC_BENCHMARK(BM_pthread_key_create);
Elliott Hughes281e06b2016-02-17 10:23:52 -0800226
227static void BM_pthread_key_delete(benchmark::State& state) {
228 while (state.KeepRunning()) {
229 state.PauseTiming();
230 pthread_key_t key;
Yi Kong32bc0fc2018-08-02 17:31:13 -0700231 pthread_key_create(&key, nullptr);
Elliott Hughes281e06b2016-02-17 10:23:52 -0800232 state.ResumeTiming();
233
Yabin Cui8cf1b302014-12-03 21:36:24 -0800234 pthread_key_delete(key);
235 }
236}
Anders Lewisa7b0f882017-07-24 20:01:13 -0700237BIONIC_BENCHMARK(BM_pthread_key_delete);