1 // Copyright 2018 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include <string.h>
6
7 #include <fbl/string_printf.h>
8 #include <fbl/unique_ptr.h>
9 #include <perftest/perftest.h>
10
11 namespace {
12
13 // Test performance of memcpy() on a block of the given size.
MemcpyTest(perftest::RepeatState * state,size_t size)14 bool MemcpyTest(perftest::RepeatState* state, size_t size) {
15 state->SetBytesProcessedPerRun(size);
16
17 fbl::unique_ptr<char[]> src(new char[size]);
18 fbl::unique_ptr<char[]> dest(new char[size]);
19 // Initialize src so that we are not copying from uninitialized memory.
20 memset(src.get(), 0, size);
21
22 while (state->KeepRunning()) {
23 memcpy(dest.get(), src.get(), size);
24 // Stop the compiler from optimizing away the memcpy() call.
25 perftest::DoNotOptimize(src.get());
26 perftest::DoNotOptimize(dest.get());
27 }
28 return true;
29 }
30
RegisterTests()31 void RegisterTests() {
32 static const size_t kSizesBytes[] = {
33 1000,
34 100000,
35 };
36 for (auto size : kSizesBytes) {
37 auto name = fbl::StringPrintf("Memcpy/%zubytes", size);
38 perftest::RegisterTest(name.c_str(), MemcpyTest, size);
39 }
40 }
41 PERFTEST_CTOR(RegisterTests);
42
43 } // namespace
44