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 <fbl/string_printf.h>
6#include <perftest/perftest.h>
7#include <zircon/assert.h>
8#include <zircon/syscalls.h>
9
10namespace {
11
12// Test sleeping for different lengths of time.
13//
14// This serves an example of a parameterized perf test.
15//
16// This can be useful for measuring the overhead of sleeping.  It can also
17// be used to measure the variation in actual sleep times.  Checking for
18// under-sleeps and over-sleeps can serve as a sanity check for the
19// perftest framework.
20//
21// Ideally we would be able to test a continuous range of sleep times,
22// which might reveal discontinuities in the actual sleep times.  The
23// perftest framework does not support this yet.
24bool SleepTest(perftest::RepeatState* state, zx_duration_t delay_ns) {
25    while (state->KeepRunning()) {
26        ZX_ASSERT(zx_nanosleep(zx_deadline_after(delay_ns)) == ZX_OK);
27    }
28    return true;
29}
30
31void RegisterTests() {
32    static const zx_duration_t kTimesNs[] = {
33        0,
34        1,
35        10,
36        100,
37        1000,
38        10000,
39    };
40    for (auto time_ns : kTimesNs) {
41        auto name = fbl::StringPrintf(
42            "Sleep/%lluns", static_cast<unsigned long long>(time_ns));
43        perftest::RegisterTest(name.c_str(), SleepTest, time_ns);
44    }
45}
46PERFTEST_CTOR(RegisterTests);
47
48}  // namespace
49