| Index: mojo/public/c/system/tests/core_perftest.cc
|
| diff --git a/mojo/public/c/system/tests/core_perftest.cc b/mojo/public/c/system/tests/core_perftest.cc
|
| deleted file mode 100644
|
| index 23fd92bc476b82261146a1d3e7a409efe8de5e32..0000000000000000000000000000000000000000
|
| --- a/mojo/public/c/system/tests/core_perftest.cc
|
| +++ /dev/null
|
| @@ -1,325 +0,0 @@
|
| -// Copyright 2013 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -// This tests the performance of the C API.
|
| -
|
| -#include "mojo/public/c/system/core.h"
|
| -
|
| -#include <assert.h>
|
| -#include <stddef.h>
|
| -#include <stdint.h>
|
| -#include <stdio.h>
|
| -
|
| -#include "mojo/public/cpp/system/macros.h"
|
| -#include "mojo/public/cpp/test_support/test_support.h"
|
| -#include "mojo/public/cpp/test_support/test_utils.h"
|
| -#include "testing/gtest/include/gtest/gtest.h"
|
| -
|
| -// TODO(vtl): (here and below) crbug.com/342893
|
| -#if !defined(WIN32)
|
| -#include <time.h>
|
| -#include "mojo/public/cpp/utility/thread.h"
|
| -#endif // !defined(WIN32)
|
| -
|
| -namespace {
|
| -
|
| -#if !defined(WIN32)
|
| -class MessagePipeWriterThread : public mojo::Thread {
|
| - public:
|
| - MessagePipeWriterThread(MojoHandle handle, uint32_t num_bytes)
|
| - : handle_(handle), num_bytes_(num_bytes), num_writes_(0) {}
|
| - ~MessagePipeWriterThread() override {}
|
| -
|
| - void Run() override {
|
| - char buffer[10000];
|
| - assert(num_bytes_ <= sizeof(buffer));
|
| -
|
| - // TODO(vtl): Should I throttle somehow?
|
| - for (;;) {
|
| - MojoResult result = MojoWriteMessage(
|
| - handle_, buffer, num_bytes_, NULL, 0, MOJO_WRITE_MESSAGE_FLAG_NONE);
|
| - if (result == MOJO_RESULT_OK) {
|
| - num_writes_++;
|
| - continue;
|
| - }
|
| -
|
| - // We failed to write.
|
| - // Either |handle_| or its peer was closed.
|
| - assert(result == MOJO_RESULT_INVALID_ARGUMENT ||
|
| - result == MOJO_RESULT_FAILED_PRECONDITION);
|
| - break;
|
| - }
|
| - }
|
| -
|
| - // Use only after joining the thread.
|
| - int64_t num_writes() const { return num_writes_; }
|
| -
|
| - private:
|
| - const MojoHandle handle_;
|
| - const uint32_t num_bytes_;
|
| - int64_t num_writes_;
|
| -
|
| - MOJO_DISALLOW_COPY_AND_ASSIGN(MessagePipeWriterThread);
|
| -};
|
| -
|
| -class MessagePipeReaderThread : public mojo::Thread {
|
| - public:
|
| - explicit MessagePipeReaderThread(MojoHandle handle)
|
| - : handle_(handle), num_reads_(0) {}
|
| - ~MessagePipeReaderThread() override {}
|
| -
|
| - void Run() override {
|
| - char buffer[10000];
|
| -
|
| - for (;;) {
|
| - uint32_t num_bytes = static_cast<uint32_t>(sizeof(buffer));
|
| - MojoResult result = MojoReadMessage(
|
| - handle_, buffer, &num_bytes, NULL, NULL, MOJO_READ_MESSAGE_FLAG_NONE);
|
| - if (result == MOJO_RESULT_OK) {
|
| - num_reads_++;
|
| - continue;
|
| - }
|
| -
|
| - if (result == MOJO_RESULT_SHOULD_WAIT) {
|
| - result = MojoWait(handle_, MOJO_HANDLE_SIGNAL_READABLE,
|
| - MOJO_DEADLINE_INDEFINITE, nullptr);
|
| - if (result == MOJO_RESULT_OK) {
|
| - // Go to the top of the loop to read again.
|
| - continue;
|
| - }
|
| - }
|
| -
|
| - // We failed to read and possibly failed to wait.
|
| - // Either |handle_| or its peer was closed.
|
| - assert(result == MOJO_RESULT_INVALID_ARGUMENT ||
|
| - result == MOJO_RESULT_FAILED_PRECONDITION);
|
| - break;
|
| - }
|
| - }
|
| -
|
| - // Use only after joining the thread.
|
| - int64_t num_reads() const { return num_reads_; }
|
| -
|
| - private:
|
| - const MojoHandle handle_;
|
| - int64_t num_reads_;
|
| -
|
| - MOJO_DISALLOW_COPY_AND_ASSIGN(MessagePipeReaderThread);
|
| -};
|
| -#endif // !defined(WIN32)
|
| -
|
| -class CorePerftest : public testing::Test {
|
| - public:
|
| - CorePerftest() : buffer_(NULL), num_bytes_(0) {}
|
| - ~CorePerftest() override {}
|
| -
|
| - static void NoOp(void* /*closure*/) {}
|
| -
|
| - static void MessagePipe_CreateAndClose(void* closure) {
|
| - CorePerftest* self = static_cast<CorePerftest*>(closure);
|
| - MojoResult result = MojoCreateMessagePipe(NULL, &self->h0_, &self->h1_);
|
| - MOJO_ALLOW_UNUSED_LOCAL(result);
|
| - assert(result == MOJO_RESULT_OK);
|
| - result = MojoClose(self->h0_);
|
| - assert(result == MOJO_RESULT_OK);
|
| - result = MojoClose(self->h1_);
|
| - assert(result == MOJO_RESULT_OK);
|
| - }
|
| -
|
| - static void MessagePipe_WriteAndRead(void* closure) {
|
| - CorePerftest* self = static_cast<CorePerftest*>(closure);
|
| - MojoResult result = MojoWriteMessage(self->h0_, self->buffer_,
|
| - self->num_bytes_, NULL, 0,
|
| - MOJO_WRITE_MESSAGE_FLAG_NONE);
|
| - MOJO_ALLOW_UNUSED_LOCAL(result);
|
| - assert(result == MOJO_RESULT_OK);
|
| - uint32_t read_bytes = self->num_bytes_;
|
| - result = MojoReadMessage(self->h1_, self->buffer_, &read_bytes, NULL, NULL,
|
| - MOJO_READ_MESSAGE_FLAG_NONE);
|
| - assert(result == MOJO_RESULT_OK);
|
| - }
|
| -
|
| - static void MessagePipe_EmptyRead(void* closure) {
|
| - CorePerftest* self = static_cast<CorePerftest*>(closure);
|
| - MojoResult result = MojoReadMessage(self->h0_, NULL, NULL, NULL, NULL,
|
| - MOJO_READ_MESSAGE_FLAG_MAY_DISCARD);
|
| - MOJO_ALLOW_UNUSED_LOCAL(result);
|
| - assert(result == MOJO_RESULT_SHOULD_WAIT);
|
| - }
|
| -
|
| - protected:
|
| -#if !defined(WIN32)
|
| - void DoMessagePipeThreadedTest(unsigned num_writers,
|
| - unsigned num_readers,
|
| - uint32_t num_bytes) {
|
| - static const int64_t kPerftestTimeMicroseconds = 3 * 1000000;
|
| -
|
| - assert(num_writers > 0);
|
| - assert(num_readers > 0);
|
| -
|
| - MojoResult result = MojoCreateMessagePipe(NULL, &h0_, &h1_);
|
| - MOJO_ALLOW_UNUSED_LOCAL(result);
|
| - assert(result == MOJO_RESULT_OK);
|
| -
|
| - std::vector<MessagePipeWriterThread*> writers;
|
| - for (unsigned i = 0; i < num_writers; i++)
|
| - writers.push_back(new MessagePipeWriterThread(h0_, num_bytes));
|
| -
|
| - std::vector<MessagePipeReaderThread*> readers;
|
| - for (unsigned i = 0; i < num_readers; i++)
|
| - readers.push_back(new MessagePipeReaderThread(h1_));
|
| -
|
| - // Start time here, just before we fire off the threads.
|
| - const MojoTimeTicks start_time = MojoGetTimeTicksNow();
|
| -
|
| - // Interleave the starts.
|
| - for (unsigned i = 0; i < num_writers || i < num_readers; i++) {
|
| - if (i < num_writers)
|
| - writers[i]->Start();
|
| - if (i < num_readers)
|
| - readers[i]->Start();
|
| - }
|
| -
|
| - Sleep(kPerftestTimeMicroseconds);
|
| -
|
| - // Close both handles to make writers and readers stop immediately.
|
| - result = MojoClose(h0_);
|
| - assert(result == MOJO_RESULT_OK);
|
| - result = MojoClose(h1_);
|
| - assert(result == MOJO_RESULT_OK);
|
| -
|
| - // Join everything.
|
| - for (unsigned i = 0; i < num_writers; i++)
|
| - writers[i]->Join();
|
| - for (unsigned i = 0; i < num_readers; i++)
|
| - readers[i]->Join();
|
| -
|
| - // Stop time here.
|
| - MojoTimeTicks end_time = MojoGetTimeTicksNow();
|
| -
|
| - // Add up write and read counts, and destroy the threads.
|
| - int64_t num_writes = 0;
|
| - for (unsigned i = 0; i < num_writers; i++) {
|
| - num_writes += writers[i]->num_writes();
|
| - delete writers[i];
|
| - }
|
| - writers.clear();
|
| - int64_t num_reads = 0;
|
| - for (unsigned i = 0; i < num_readers; i++) {
|
| - num_reads += readers[i]->num_reads();
|
| - delete readers[i];
|
| - }
|
| - readers.clear();
|
| -
|
| - char sub_test_name[200];
|
| - sprintf(sub_test_name, "%uw_%ur_%ubytes", num_writers, num_readers,
|
| - static_cast<unsigned>(num_bytes));
|
| - mojo::test::LogPerfResult(
|
| - "MessagePipe_Threaded_Writes", sub_test_name,
|
| - 1000000.0 * static_cast<double>(num_writes) / (end_time - start_time),
|
| - "writes/second");
|
| - mojo::test::LogPerfResult(
|
| - "MessagePipe_Threaded_Reads", sub_test_name,
|
| - 1000000.0 * static_cast<double>(num_reads) / (end_time - start_time),
|
| - "reads/second");
|
| - }
|
| -#endif // !defined(WIN32)
|
| -
|
| - MojoHandle h0_;
|
| - MojoHandle h1_;
|
| -
|
| - void* buffer_;
|
| - uint32_t num_bytes_;
|
| -
|
| - private:
|
| -#if !defined(WIN32)
|
| - void Sleep(int64_t microseconds) {
|
| - struct timespec req = {
|
| - static_cast<time_t>(microseconds / 1000000), // Seconds.
|
| - static_cast<long>(microseconds % 1000000) * 1000L // Nanoseconds.
|
| - };
|
| - int rv = nanosleep(&req, NULL);
|
| - MOJO_ALLOW_UNUSED_LOCAL(rv);
|
| - assert(rv == 0);
|
| - }
|
| -#endif // !defined(WIN32)
|
| -
|
| - MOJO_DISALLOW_COPY_AND_ASSIGN(CorePerftest);
|
| -};
|
| -
|
| -// A no-op test so we can compare performance.
|
| -TEST_F(CorePerftest, NoOp) {
|
| - mojo::test::IterateAndReportPerf("Iterate_NoOp", nullptr, &CorePerftest::NoOp,
|
| - this);
|
| -}
|
| -
|
| -TEST_F(CorePerftest, MessagePipe_CreateAndClose) {
|
| - mojo::test::IterateAndReportPerf("MessagePipe_CreateAndClose", nullptr,
|
| - &CorePerftest::MessagePipe_CreateAndClose,
|
| - this);
|
| -}
|
| -
|
| -TEST_F(CorePerftest, MessagePipe_WriteAndRead) {
|
| - MojoResult result = MojoCreateMessagePipe(NULL, &h0_, &h1_);
|
| - MOJO_ALLOW_UNUSED_LOCAL(result);
|
| - assert(result == MOJO_RESULT_OK);
|
| - char buffer[10000] = {0};
|
| - buffer_ = buffer;
|
| - num_bytes_ = 10u;
|
| - mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead", "10bytes",
|
| - &CorePerftest::MessagePipe_WriteAndRead,
|
| - this);
|
| - num_bytes_ = 100u;
|
| - mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead", "100bytes",
|
| - &CorePerftest::MessagePipe_WriteAndRead,
|
| - this);
|
| - num_bytes_ = 1000u;
|
| - mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead", "1000bytes",
|
| - &CorePerftest::MessagePipe_WriteAndRead,
|
| - this);
|
| - num_bytes_ = 10000u;
|
| - mojo::test::IterateAndReportPerf("MessagePipe_WriteAndRead", "10000bytes",
|
| - &CorePerftest::MessagePipe_WriteAndRead,
|
| - this);
|
| - result = MojoClose(h0_);
|
| - assert(result == MOJO_RESULT_OK);
|
| - result = MojoClose(h1_);
|
| - assert(result == MOJO_RESULT_OK);
|
| -}
|
| -
|
| -TEST_F(CorePerftest, MessagePipe_EmptyRead) {
|
| - MojoResult result = MojoCreateMessagePipe(NULL, &h0_, &h1_);
|
| - MOJO_ALLOW_UNUSED_LOCAL(result);
|
| - assert(result == MOJO_RESULT_OK);
|
| - mojo::test::IterateAndReportPerf("MessagePipe_EmptyRead", nullptr,
|
| - &CorePerftest::MessagePipe_EmptyRead, this);
|
| - result = MojoClose(h0_);
|
| - assert(result == MOJO_RESULT_OK);
|
| - result = MojoClose(h1_);
|
| - assert(result == MOJO_RESULT_OK);
|
| -}
|
| -
|
| -#if !defined(WIN32)
|
| -TEST_F(CorePerftest, MessagePipe_Threaded) {
|
| - DoMessagePipeThreadedTest(1u, 1u, 100u);
|
| - DoMessagePipeThreadedTest(2u, 2u, 100u);
|
| - DoMessagePipeThreadedTest(3u, 3u, 100u);
|
| - DoMessagePipeThreadedTest(10u, 10u, 100u);
|
| - DoMessagePipeThreadedTest(10u, 1u, 100u);
|
| - DoMessagePipeThreadedTest(1u, 10u, 100u);
|
| -
|
| - // For comparison of overhead:
|
| - DoMessagePipeThreadedTest(1u, 1u, 10u);
|
| - // 100 was done above.
|
| - DoMessagePipeThreadedTest(1u, 1u, 1000u);
|
| - DoMessagePipeThreadedTest(1u, 1u, 10000u);
|
| -
|
| - DoMessagePipeThreadedTest(3u, 3u, 10u);
|
| - // 100 was done above.
|
| - DoMessagePipeThreadedTest(3u, 3u, 1000u);
|
| - DoMessagePipeThreadedTest(3u, 3u, 10000u);
|
| -}
|
| -#endif // !defined(WIN32)
|
| -
|
| -} // namespace
|
|
|