ZeroCopyBenchmark.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /*
  2. * Copyright 2017-present Facebook, Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #include <folly/Benchmark.h>
  17. #include <folly/io/async/test/ZeroCopy.h>
  18. #include <folly/portability/GFlags.h>
  19. using namespace folly;
  20. namespace {
  21. void runClient(
  22. const std::string& host,
  23. uint16_t port,
  24. int numLoops,
  25. bool zeroCopy,
  26. size_t bufferSize) {
  27. LOG(INFO) << "Running client. host = " << host << " port = " << port
  28. << " numLoops = " << numLoops << " zeroCopy = " << zeroCopy
  29. << " bufferSize = " << bufferSize;
  30. size_t counter = 1;
  31. EventBase evb;
  32. std::unique_ptr<ZeroCopyTestAsyncSocket> client(new ZeroCopyTestAsyncSocket(
  33. &counter, &evb, numLoops, bufferSize, zeroCopy));
  34. SocketAddress addr(host, port);
  35. evb.runInEventBaseThread([&]() { client->connect(addr); });
  36. evb.loopForever();
  37. }
  38. void runServer(uint16_t port, int numLoops, bool zeroCopy, size_t bufferSize) {
  39. LOG(INFO) << "Running server. port = " << port << " numLoops = " << numLoops
  40. << " zeroCopy = " << zeroCopy << " bufferSize = " << bufferSize;
  41. EventBase evb;
  42. folly::AsyncServerSocket::UniquePtr listenSock(
  43. new folly::AsyncServerSocket(&evb));
  44. ZeroCopyTestServer server(&evb, numLoops, bufferSize, zeroCopy);
  45. server.addCallbackToServerSocket(*listenSock);
  46. evb.runInEventBaseThread([&]() {
  47. listenSock->bind(port);
  48. listenSock->setZeroCopy(zeroCopy);
  49. listenSock->listen(10);
  50. listenSock->startAccepting();
  51. });
  52. evb.loopForever();
  53. }
  54. } // namespace
  55. static auto constexpr kMaxLoops = 20000;
  56. void zeroCopyOn(unsigned iters, size_t bufferSize, size_t numClients = 1) {
  57. BenchmarkSuspender susp;
  58. ZeroCopyTest test(numClients, iters, true, bufferSize);
  59. susp.dismiss();
  60. test.run();
  61. susp.rehire();
  62. }
  63. void zeroCopyOff(unsigned iters, size_t bufferSize, size_t numClients = 1) {
  64. BenchmarkSuspender susp;
  65. ZeroCopyTest test(numClients, iters, false, bufferSize);
  66. susp.dismiss();
  67. test.run();
  68. susp.rehire();
  69. }
  70. static auto constexpr kNumClients = 40;
  71. void zeroCopyOnMulti(unsigned iters, size_t bufferSize) {
  72. zeroCopyOn(iters, bufferSize, kNumClients);
  73. }
  74. void zeroCopyOffMulti(unsigned iters, size_t bufferSize) {
  75. zeroCopyOff(iters, bufferSize, kNumClients);
  76. }
  77. BENCHMARK_PARAM(zeroCopyOn, 4096)
  78. BENCHMARK_PARAM(zeroCopyOff, 4096)
  79. BENCHMARK_DRAW_LINE();
  80. BENCHMARK_PARAM(zeroCopyOn, 8192)
  81. BENCHMARK_PARAM(zeroCopyOff, 8192)
  82. BENCHMARK_DRAW_LINE();
  83. BENCHMARK_PARAM(zeroCopyOn, 16384)
  84. BENCHMARK_PARAM(zeroCopyOff, 16384)
  85. BENCHMARK_DRAW_LINE();
  86. BENCHMARK_PARAM(zeroCopyOn, 32768)
  87. BENCHMARK_PARAM(zeroCopyOff, 32768)
  88. BENCHMARK_DRAW_LINE();
  89. BENCHMARK_PARAM(zeroCopyOn, 65536)
  90. BENCHMARK_PARAM(zeroCopyOff, 65536)
  91. BENCHMARK_DRAW_LINE();
  92. BENCHMARK_PARAM(zeroCopyOn, 131072)
  93. BENCHMARK_PARAM(zeroCopyOff, 131072)
  94. BENCHMARK_DRAW_LINE();
  95. BENCHMARK_PARAM(zeroCopyOn, 262144)
  96. BENCHMARK_PARAM(zeroCopyOff, 262144)
  97. BENCHMARK_DRAW_LINE();
  98. BENCHMARK_PARAM(zeroCopyOn, 524288)
  99. BENCHMARK_PARAM(zeroCopyOff, 524288)
  100. BENCHMARK_DRAW_LINE();
  101. BENCHMARK_PARAM(zeroCopyOn, 1048576)
  102. BENCHMARK_PARAM(zeroCopyOff, 1048576)
  103. BENCHMARK_DRAW_LINE();
  104. BENCHMARK_PARAM(zeroCopyOnMulti, 1048576)
  105. BENCHMARK_PARAM(zeroCopyOffMulti, 1048576)
  106. BENCHMARK_DRAW_LINE();
  107. DEFINE_bool(client, false, "client mode");
  108. DEFINE_bool(server, false, "server mode");
  109. DEFINE_bool(zeroCopy, false, "use zerocopy");
  110. DEFINE_int32(numLoops, kMaxLoops, "number of loops");
  111. DEFINE_int32(bufferSize, 524288, "buffer size");
  112. DEFINE_int32(port, 33130, "port");
  113. DEFINE_string(host, "::1", "host");
  114. int main(int argc, char** argv) {
  115. gflags::ParseCommandLineFlags(&argc, &argv, true);
  116. if (FLAGS_client) {
  117. runClient(
  118. FLAGS_host,
  119. FLAGS_port,
  120. FLAGS_numLoops,
  121. FLAGS_zeroCopy,
  122. FLAGS_bufferSize);
  123. } else if (FLAGS_server) {
  124. runServer(FLAGS_port, FLAGS_numLoops, FLAGS_zeroCopy, FLAGS_bufferSize);
  125. } else {
  126. runBenchmarks();
  127. }
  128. }