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