Index: third_party/mojo/src/mojo/public/cpp/bindings/tests/bindings_perftest.cc |
diff --git a/third_party/mojo/src/mojo/public/cpp/bindings/tests/bindings_perftest.cc b/third_party/mojo/src/mojo/public/cpp/bindings/tests/bindings_perftest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..7440acce1e03679247e9761bf5e451f7feb451b9 |
--- /dev/null |
+++ b/third_party/mojo/src/mojo/public/cpp/bindings/tests/bindings_perftest.cc |
@@ -0,0 +1,127 @@ |
+// Copyright 2015 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. |
+ |
+#include "mojo/public/cpp/bindings/binding.h" |
+#include "mojo/public/cpp/test_support/test_support.h" |
+#include "mojo/public/cpp/test_support/test_utils.h" |
+#include "mojo/public/cpp/utility/run_loop.h" |
+#include "mojo/public/interfaces/bindings/tests/ping_service.mojom.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+ |
+namespace mojo { |
+namespace { |
+ |
+const double kMojoTicksPerSecond = 1000000.0; |
+ |
+double MojoTicksToSeconds(MojoTimeTicks ticks) { |
+ return ticks / kMojoTicksPerSecond; |
+} |
+ |
+class PingServiceImpl : public test::PingService { |
+ public: |
+ explicit PingServiceImpl() {} |
+ ~PingServiceImpl() override {} |
+ |
+ // |PingService| methods: |
+ void Ping(const Callback<void()>& callback) override; |
+ |
+ private: |
+ MOJO_DISALLOW_COPY_AND_ASSIGN(PingServiceImpl); |
+}; |
+ |
+void PingServiceImpl::Ping(const Callback<void()>& callback) { |
+ callback.Run(); |
+} |
+ |
+class PingPongTest { |
+ public: |
+ explicit PingPongTest(test::PingServicePtr service); |
+ |
+ void Run(unsigned int iterations); |
+ |
+ private: |
+ void OnPingDone(); |
+ |
+ test::PingServicePtr service_; |
+ unsigned int iterations_to_run_; |
+ unsigned int current_iterations_; |
+ |
+ MOJO_DISALLOW_COPY_AND_ASSIGN(PingPongTest); |
+}; |
+ |
+PingPongTest::PingPongTest(test::PingServicePtr service) |
+ : service_(service.Pass()) { |
+} |
+ |
+void PingPongTest::Run(unsigned int iterations) { |
+ iterations_to_run_ = iterations; |
+ current_iterations_ = 0; |
+ |
+ service_->Ping([this]() { OnPingDone(); }); |
+ RunLoop::current()->Run(); |
+} |
+ |
+void PingPongTest::OnPingDone() { |
+ current_iterations_++; |
+ if (current_iterations_ >= iterations_to_run_) { |
+ RunLoop::current()->Quit(); |
+ return; |
+ } |
+ |
+ service_->Ping([this]() { OnPingDone(); }); |
+} |
+ |
+struct BoundPingService { |
+ BoundPingService() : binding(&impl) { |
+ binding.Bind(GetProxy(&service)); |
+ } |
+ |
+ PingServiceImpl impl; |
+ test::PingServicePtr service; |
+ Binding<test::PingService> binding; |
+}; |
+ |
+class MojoBindingsPerftest : public testing::Test { |
+ protected: |
+ Environment env_; |
+ RunLoop run_loop_; |
+}; |
+ |
+TEST_F(MojoBindingsPerftest, InProcessPingPong) { |
+ test::PingServicePtr service; |
+ PingServiceImpl impl; |
+ Binding<test::PingService> binding(&impl, GetProxy(&service)); |
+ PingPongTest test(service.Pass()); |
+ |
+ { |
+ const unsigned int kIterations = 100000; |
+ const MojoTimeTicks start_time = MojoGetTimeTicksNow(); |
+ test.Run(kIterations); |
+ const MojoTimeTicks end_time = MojoGetTimeTicksNow(); |
+ test::LogPerfResult( |
+ "InProcessPingPong", "0_Inactive", |
+ kIterations / MojoTicksToSeconds(end_time - start_time), |
+ "pings/second"); |
+ } |
+ |
+ { |
+ const size_t kNumInactiveServices = 1000; |
+ BoundPingService* inactive_services = |
+ new BoundPingService[kNumInactiveServices]; |
+ |
+ const unsigned int kIterations = 10000; |
+ const MojoTimeTicks start_time = MojoGetTimeTicksNow(); |
+ test.Run(kIterations); |
+ const MojoTimeTicks end_time = MojoGetTimeTicksNow(); |
+ test::LogPerfResult( |
+ "InProcessPingPong", "1000_Inactive", |
+ kIterations / MojoTicksToSeconds(end_time - start_time), |
+ "pings/second"); |
+ |
+ delete[] inactive_services; |
+ } |
+} |
+ |
+} // namespace |
+} // namespace mojo |