blob: 789d63ad60469ee2d83f453342a5cfe038b43e63 [file] [log] [blame]
// Copyright 2019 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 <stdlib.h>
#include <zircon/syscalls.h>
#include <random>
#include <type_traits>
#include "perftest/perftest.h"
namespace {
// Measure the time per call, as well as throughput, for retrieving random bytes
// from |RandFunc|.
template <auto RandFunc>
bool GetFrom(perftest::RepeatState* state) {
state->SetBytesProcessedPerRun(sizeof(RandFunc()));
while (state->KeepRunning()) {
auto r = RandFunc();
perftest::DoNotOptimize(r);
}
return true;
}
// Measure the time per call, as well as throughput, for reading random bytes
// from std::radnom_device.
bool GetFromRandomDevice(perftest::RepeatState* state) {
std::random_device rd;
state->SetBytesProcessedPerRun(sizeof(decltype(rd)::result_type));
while (state->KeepRunning()) {
auto r = rd();
perftest::DoNotOptimize(r);
}
return true;
}
// Measure the time per call, as well as throughput, for reading random data
// from Zircon.
bool GetFromZxCprng(perftest::RepeatState* state) {
uint64_t r;
state->SetBytesProcessedPerRun(sizeof(r));
while (state->KeepRunning()) {
zx_cprng_draw(&r, sizeof(r));
perftest::DoNotOptimize(r);
}
return true;
}
void RegisterTests() {
perftest::RegisterTest("Prng/LibCpp/RandomDevice", GetFromRandomDevice);
perftest::RegisterTest("Prng/Zx/CprngDraw", GetFromZxCprng);
// Deprecated/discouraged PRNGs.
// rand() is not a cryptographically secure PRNG.
perftest::RegisterTest("Prng/DoNotUse/LibC/Rand", GetFrom<rand>);
// random() should never be used, as it simply generates sequential numbers.
perftest::RegisterTest("Prng/DoNotUse/LibC/Random", GetFrom<random>);
}
PERFTEST_CTOR(RegisterTests);
} // namespace