| // 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 <lib/zx/socket.h> | |
| #include <vector> | |
| #include <fbl/string_printf.h> | |
| #include <perftest/perftest.h> | |
| #include "assert.h" | |
| namespace { | |
| // Measure the times taken to enqueue and then dequeue some bytes from a | |
| // Zircon socket, on a single thread. This does not involve any | |
| // cross-thread wakeups. | |
| bool SocketWriteReadTest(perftest::RepeatState* state, uint32_t message_size) { | |
| state->DeclareStep("write"); | |
| state->DeclareStep("read"); | |
| state->SetBytesProcessedPerRun(message_size); | |
| zx::socket socket1; | |
| zx::socket socket2; | |
| ASSERT_OK(zx::socket::create(ZX_SOCKET_STREAM, &socket1, &socket2)); | |
| std::vector<char> buffer(message_size); | |
| while (state->KeepRunning()) { | |
| size_t bytes_written; | |
| ASSERT_OK(socket1.write(0, buffer.data(), buffer.size(), &bytes_written)); | |
| ZX_ASSERT(bytes_written == buffer.size()); | |
| state->NextStep(); | |
| size_t bytes_read; | |
| ASSERT_OK(socket2.read(0, buffer.data(), buffer.size(), &bytes_read)); | |
| ZX_ASSERT(bytes_read == buffer.size()); | |
| } | |
| return true; | |
| } | |
| void RegisterTests() { | |
| static const unsigned kMessageSizesInBytes[] = { | |
| 64, | |
| 1 * 1024, | |
| 32 * 1024, | |
| 64 * 1024, | |
| }; | |
| for (auto message_size : kMessageSizesInBytes) { | |
| auto name = fbl::StringPrintf("Socket/WriteRead/%ubytes", message_size); | |
| perftest::RegisterTest(name.c_str(), SocketWriteReadTest, message_size); | |
| } | |
| } | |
| PERFTEST_CTOR(RegisterTests); | |
| } // namespace |