diff options
author | Anders Lewis <agloo@google.com> | 2017-06-07 13:00:38 -0700 |
---|---|---|
committer | Anders Lewis <agloo@google.com> | 2017-06-09 13:30:34 -0700 |
commit | 271be9bb7df6f3910a929ef7bff55fbd9bc2dee6 (patch) | |
tree | cbada1d44532b8e463156c9d086733c37ebabf3f /benchmarks/string_benchmark.cpp | |
parent | 5c76fec2821c9a5228e681ef37525f9b30fa5805 (diff) |
Split memmove benchmark into separate overlapping (src before dst and dst before src) and non-overlapping tests.
Test: Ran benchmarks and verified that runtimes were sensible.
Change-Id: Ia7fbc5596dfdc162fff2364f4ef6dafe5549b907
Diffstat (limited to 'benchmarks/string_benchmark.cpp')
-rw-r--r-- | benchmarks/string_benchmark.cpp | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/benchmarks/string_benchmark.cpp b/benchmarks/string_benchmark.cpp index 41306db1c..aa1e8c9aa 100644 --- a/benchmarks/string_benchmark.cpp +++ b/benchmarks/string_benchmark.cpp @@ -58,19 +58,42 @@ static void BM_string_memcpy(benchmark::State& state) { } BENCHMARK(BM_string_memcpy)->AT_COMMON_SIZES; -static void BM_string_memmove(benchmark::State& state) { +static void BM_string_memmove_non_overlapping(benchmark::State& state) { const size_t nbytes = state.range(0); - char* buf = new char[nbytes + 64]; - memset(buf, 'x', nbytes + 64); + std::vector<char> src(nbytes, 'x'); + std::vector<char> dst(nbytes, 'x'); while (state.KeepRunning()) { - memmove(buf, buf + 1, nbytes); // Worst-case overlap. + memmove(dst.data(), src.data(), nbytes); } state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes)); - delete[] buf; } -BENCHMARK(BM_string_memmove)->AT_COMMON_SIZES; +BENCHMARK(BM_string_memmove_non_overlapping)->AT_COMMON_SIZES; + +static void BM_string_memmove_overlap_dst_before_src(benchmark::State& state) { + const size_t nbytes = state.range(0); + std::vector<char> buf(nbytes + 1, 'x'); + + while (state.KeepRunning()) { + memmove(buf.data(), buf.data() + 1, nbytes); // Worst-case overlap. + } + + state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes)); +} +BENCHMARK(BM_string_memmove_overlap_dst_before_src)->AT_COMMON_SIZES; + +static void BM_string_memmove_overlap_src_before_dst(benchmark::State& state) { + const size_t nbytes = state.range(0); + std::vector<char> buf(nbytes + 1, 'x'); + + while (state.KeepRunning()) { + memmove(buf.data() + 1, buf.data(), nbytes); // Worst-case overlap. + } + + state.SetBytesProcessed(uint64_t(state.iterations()) * uint64_t(nbytes)); +} +BENCHMARK(BM_string_memmove_overlap_src_before_dst)->AT_COMMON_SIZES; static void BM_string_memset(benchmark::State& state) { const size_t nbytes = state.range(0); |