blob: 2da5708addf90de7eb84887210bd80b7d58b6dfe [file] [log] [blame]
// Copyright 2016 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 <vector>
#include <fbl/string_printf.h>
#include <lib/zx/channel.h>
#include <perftest/perftest.h>
namespace {
// Measure the times taken to enqueue and then dequeue a message from a
// Zircon channel, on a single thread. This does not involve any
// cross-thread wakeups.
bool ChannelWriteReadTest(perftest::RepeatState* state, uint32_t message_size) {
state->DeclareStep("write");
state->DeclareStep("read");
state->SetBytesProcessedPerRun(message_size);
zx::channel channel1;
zx::channel channel2;
ZX_ASSERT(zx::channel::create(0, &channel1, &channel2) == ZX_OK);
std::vector<char> buffer(message_size);
while (state->KeepRunning()) {
ZX_ASSERT(channel1.write(0, buffer.data(), buffer.size(), nullptr, 0) ==
ZX_OK);
state->NextStep();
ZX_ASSERT(channel2.read(0, buffer.data(), nullptr, buffer.size(), 0,
nullptr, nullptr) == ZX_OK);
}
return true;
}
void RegisterTests() {
static const unsigned kMessageSizesInBytes[] = {
64,
1 * 1024,
32 * 1024,
64 * 1024,
};
for (auto message_size : kMessageSizesInBytes) {
auto name = fbl::StringPrintf("Channel/WriteRead/%ubytes", message_size);
perftest::RegisterTest(name.c_str(), ChannelWriteReadTest, message_size);
}
}
PERFTEST_CTOR(RegisterTests);
} // namespace