mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
136 lines
3.9 KiB
C++
136 lines
3.9 KiB
C++
// 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 <numeric>
|
|
|
|
#include "base/logging.h"
|
|
#include "base/message_loop/message_loop.h"
|
|
#include "base/timer/elapsed_timer.h"
|
|
#include "base/tracked_objects.h"
|
|
#include "mojo/common/message_pump_mojo.h"
|
|
#include "mojo/public/cpp/bindings/binding.h"
|
|
#include "mojo/public/cpp/environment/environment.h"
|
|
#include "mojo/public/cpp/environment/task_tracker.h"
|
|
#include "mojo/public/cpp/test_support/test_support.h"
|
|
#include "mojo/public/cpp/test_support/test_utils.h"
|
|
#include "mojo/public/interfaces/bindings/tests/sample_interfaces.mojom.h"
|
|
#include "testing/gtest/include/gtest/gtest.h"
|
|
|
|
namespace mojo {
|
|
namespace test {
|
|
namespace {
|
|
|
|
class ProviderImpl : public sample::Provider {
|
|
public:
|
|
explicit ProviderImpl(InterfaceRequest<sample::Provider> request)
|
|
: binding_(this, request.Pass()) {}
|
|
|
|
void EchoString(const String& a,
|
|
const Callback<void(String)>& callback) override {
|
|
callback.Run(a);
|
|
}
|
|
|
|
void EchoStrings(const String& a,
|
|
const String& b,
|
|
const Callback<void(String, String)>& callback) override {
|
|
CHECK(false);
|
|
}
|
|
|
|
void EchoMessagePipeHandle(
|
|
ScopedMessagePipeHandle a,
|
|
const Callback<void(ScopedMessagePipeHandle)>& callback) override {
|
|
CHECK(false);
|
|
}
|
|
|
|
void EchoEnum(sample::Enum a,
|
|
const Callback<void(sample::Enum)>& callback) override {
|
|
CHECK(false);
|
|
}
|
|
|
|
void EchoInt(int32_t a, const EchoIntCallback& callback) override {
|
|
CHECK(false);
|
|
}
|
|
|
|
Binding<sample::Provider> binding_;
|
|
};
|
|
|
|
class RequestResponsePerfTest : public testing::Test {
|
|
public:
|
|
RequestResponsePerfTest()
|
|
: loop_(make_scoped_ptr(new common::MessagePumpMojo())) {}
|
|
|
|
~RequestResponsePerfTest() override { loop_.RunUntilIdle(); }
|
|
|
|
void Iterate(size_t count);
|
|
void Measure(const char* case_nam);
|
|
|
|
void SetUp() override {
|
|
tracked_objects::ThreadData::InitializeAndSetTrackingStatus(
|
|
tracked_objects::ThreadData::PROFILING_ACTIVE);
|
|
}
|
|
|
|
void TearDown() override {
|
|
tracked_objects::ThreadData::InitializeAndSetTrackingStatus(
|
|
tracked_objects::ThreadData::DEACTIVATED);
|
|
}
|
|
|
|
void PumpMessages() { loop_.RunUntilIdle(); }
|
|
|
|
private:
|
|
base::MessageLoop loop_;
|
|
};
|
|
|
|
const size_t kCallsPerIteration = 1000;
|
|
const size_t kIterations = 1000;
|
|
|
|
void RequestResponsePerfTest::Iterate(size_t count) {
|
|
sample::ProviderPtr provider;
|
|
ProviderImpl provider_impl(GetProxy(&provider));
|
|
|
|
size_t remaining = count;
|
|
Callback<void(const String&)> reply =
|
|
[&provider, &reply, &remaining](const String& a) {
|
|
if (!remaining)
|
|
return;
|
|
remaining--;
|
|
provider->EchoString(a, reply);
|
|
};
|
|
|
|
provider->EchoString(String::From("hello"), reply);
|
|
PumpMessages();
|
|
}
|
|
|
|
void RequestResponsePerfTest::Measure(const char* case_name) {
|
|
std::vector<double> laps;
|
|
for (size_t i = 0; i < kIterations; ++i) {
|
|
base::ElapsedTimer timer;
|
|
Iterate(kCallsPerIteration);
|
|
laps.push_back(timer.Elapsed().InMillisecondsF());
|
|
}
|
|
|
|
double avg = std::accumulate(laps.begin(), laps.end(), 0.0) / laps.size();
|
|
double var = std::accumulate(laps.begin(), laps.end(), 0.0, [avg](double acc,
|
|
double x) {
|
|
return acc + (x - avg) * (x - avg);
|
|
}) / laps.size();
|
|
|
|
double sd = sqrt(var);
|
|
mojo::test::LogPerfResult(case_name, "Avg", avg, "ms/1000call");
|
|
mojo::test::LogPerfResult(case_name, "SD", sd, "ms/1000call");
|
|
}
|
|
|
|
TEST_F(RequestResponsePerfTest, TrackingEnabled) {
|
|
Environment::GetDefaultTaskTracker()->SetEnabled(true);
|
|
Measure(__FUNCTION__);
|
|
Environment::GetDefaultTaskTracker()->SetEnabled(false);
|
|
}
|
|
|
|
TEST_F(RequestResponsePerfTest, TrackingDisabled) {
|
|
Measure(__FUNCTION__);
|
|
}
|
|
|
|
} // namespace
|
|
} // namespace test
|
|
} // namespace mojo
|