summaryrefslogtreecommitdiff
path: root/benchmarks/stdlib_benchmark.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'benchmarks/stdlib_benchmark.cpp')
-rw-r--r--benchmarks/stdlib_benchmark.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/benchmarks/stdlib_benchmark.cpp b/benchmarks/stdlib_benchmark.cpp
index 61b51fa54..45b953f61 100644
--- a/benchmarks/stdlib_benchmark.cpp
+++ b/benchmarks/stdlib_benchmark.cpp
@@ -59,6 +59,41 @@ static void BM_stdlib_malloc_free_decay1(benchmark::State& state) {
BIONIC_BENCHMARK_WITH_ARG(BM_stdlib_malloc_free_decay1, "AT_COMMON_SIZES");
#endif
+static void CallocFree(benchmark::State& state) {
+ const size_t nbytes = state.range(0);
+ int pagesize = getpagesize();
+
+ for (auto _ : state) {
+ void* ptr;
+ benchmark::DoNotOptimize(ptr = calloc(1, nbytes));
+ MakeAllocationResident(ptr, nbytes, pagesize);
+ free(ptr);
+ }
+
+ state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes));
+}
+
+static void BM_stdlib_calloc_free_default(benchmark::State& state) {
+#if defined(__BIONIC__)
+ // The default is expected to be a zero decay time.
+ mallopt(M_DECAY_TIME, 0);
+#endif
+
+ CallocFree(state);
+}
+BIONIC_BENCHMARK_WITH_ARG(BM_stdlib_calloc_free_default, "AT_COMMON_SIZES");
+
+#if defined(__BIONIC__)
+static void BM_stdlib_calloc_free_decay1(benchmark::State& state) {
+ mallopt(M_DECAY_TIME, 1);
+
+ CallocFree(state);
+
+ mallopt(M_DECAY_TIME, 0);
+}
+BIONIC_BENCHMARK_WITH_ARG(BM_stdlib_calloc_free_decay1, "AT_COMMON_SIZES");
+#endif
+
static void MallocMultiple(benchmark::State& state, size_t nbytes, size_t numAllocs) {
int pagesize = getpagesize();
void* ptrs[numAllocs];