// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include <string.h>

#include <memory>

#include <fbl/string_printf.h>
#include <perftest/perftest.h>

namespace {

// Test performance of memcpy() on a block of the given size.
bool MemcpyTest(perftest::RepeatState* state, size_t size) {
  std::unique_ptr<char[]> src(new char[size]);
  std::unique_ptr<char[]> dest(new char[size]);
  // Initialize src so that we are not copying from uninitialized memory.
  memset(src.get(), 0, size);

  while (state->KeepRunning()) {
    memcpy(dest.get(), src.get(), size);
    // Stop the compiler from optimizing away the memcpy() call.
    perftest::DoNotOptimize(src.get());
    perftest::DoNotOptimize(dest.get());
  }
  return true;
}

void RegisterTests() {
  static const size_t kSizesBytes[] = {
      1000,
      100000,
  };
  for (auto size : kSizesBytes) {
    auto name = fbl::StringPrintf("Memcpy/%zubytes", size);
    perftest::RegisterTest(name.c_str(), MemcpyTest, size);
  }
}
PERFTEST_CTOR(RegisterTests)

}  // namespace
