| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 | /* * * Copyright 2018 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *     http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */#include <benchmark/benchmark.h>#include <string>#include <thread>  // NOLINT#include "absl/base/call_once.h"#include "absl/strings/str_cat.h"#include "include/grpc++/grpc++.h"#include "opencensus/stats/stats.h"#include "src/cpp/ext/filters/census/grpc_plugin.h"#include "src/proto/grpc/testing/echo.grpc.pb.h"#include "test/cpp/microbenchmarks/helpers.h"absl::once_flag once;void RegisterOnce() { absl::call_once(once, grpc::RegisterOpenCensusPlugin); }class EchoServer final : public grpc::testing::EchoTestService::Service {  grpc::Status Echo(grpc::ServerContext* context,                    const grpc::testing::EchoRequest* request,                    grpc::testing::EchoResponse* response) override {    if (request->param().expected_error().code() == 0) {      response->set_message(request->message());      return grpc::Status::OK;    } else {      return grpc::Status(static_cast<grpc::StatusCode>(                              request->param().expected_error().code()),                          "");    }  }};// An EchoServerThread object creates an EchoServer on a separate thread and// shuts down the server and thread when it goes out of scope.class EchoServerThread final { public:  EchoServerThread() {    grpc::ServerBuilder builder;    int port;    builder.AddListeningPort("[::]:0", grpc::InsecureServerCredentials(),                             &port);    builder.RegisterService(&service_);    server_ = builder.BuildAndStart();    if (server_ == nullptr || port == 0) {      std::abort();    }    server_address_ = absl::StrCat("[::]:", port);    server_thread_ = std::thread(&EchoServerThread::RunServerLoop, this);  }  ~EchoServerThread() {    server_->Shutdown();    server_thread_.join();  }  const std::string& address() { return server_address_; } private:  void RunServerLoop() { server_->Wait(); }  std::string server_address_;  EchoServer service_;  std::unique_ptr<grpc::Server> server_;  std::thread server_thread_;};static void BM_E2eLatencyCensusDisabled(benchmark::State& state) {  EchoServerThread server;  std::unique_ptr<grpc::testing::EchoTestService::Stub> stub =      grpc::testing::EchoTestService::NewStub(grpc::CreateChannel(          server.address(), grpc::InsecureChannelCredentials()));  grpc::testing::EchoResponse response;  for (auto _ : state) {    grpc::testing::EchoRequest request;    grpc::ClientContext context;    grpc::Status status = stub->Echo(&context, request, &response);  }}BENCHMARK(BM_E2eLatencyCensusDisabled);static void BM_E2eLatencyCensusEnabled(benchmark::State& state) {  RegisterOnce();  // This we can safely repeat, and doing so clears accumulated data to avoid  // initialization costs varying between runs.  grpc::RegisterOpenCensusViewsForExport();  EchoServerThread server;  std::unique_ptr<grpc::testing::EchoTestService::Stub> stub =      grpc::testing::EchoTestService::NewStub(grpc::CreateChannel(          server.address(), grpc::InsecureChannelCredentials()));  grpc::testing::EchoResponse response;  for (auto _ : state) {    grpc::testing::EchoRequest request;    grpc::ClientContext context;    grpc::Status status = stub->Echo(&context, request, &response);  }}BENCHMARK(BM_E2eLatencyCensusEnabled);BENCHMARK_MAIN();
 |