Adds writer test case for RCU
[folly.git] / folly / io / async / test / ZeroCopyBenchmark.cpp
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
17 #include <folly/Benchmark.h>
18 #include <folly/io/async/test/ZeroCopy.h>
19 #include <folly/portability/GFlags.h>
20
21 using namespace folly;
22 namespace {
23 void runClient(
24     const std::string& host,
25     uint16_t port,
26     int numLoops,
27     bool zeroCopy,
28     size_t bufferSize) {
29   LOG(INFO) << "Running client. host = " << host << " port = " << port
30             << " numLoops = " << numLoops << " zeroCopy = " << zeroCopy
31             << " bufferSize = " << bufferSize;
32
33   EventBase evb;
34   std::unique_ptr<ZeroCopyTestAsyncSocket> client(
35       new ZeroCopyTestAsyncSocket(&evb, numLoops, bufferSize, zeroCopy));
36   SocketAddress addr(host, port);
37   evb.runInEventBaseThread([&]() { client->connect(addr); });
38
39   evb.loopForever();
40 }
41
42 void runServer(uint16_t port, int numLoops, bool zeroCopy, size_t bufferSize) {
43   LOG(INFO) << "Running server. port = " << port << " numLoops = " << numLoops
44             << " zeroCopy = " << zeroCopy << " bufferSize = " << bufferSize;
45
46   EventBase evb;
47   folly::AsyncServerSocket::UniquePtr listenSock(
48       new folly::AsyncServerSocket(&evb));
49   ZeroCopyTestServer server(&evb, numLoops, bufferSize, zeroCopy);
50
51   server.addCallbackToServerSocket(*listenSock);
52
53   evb.runInEventBaseThread([&]() {
54     listenSock->bind(port);
55     listenSock->setZeroCopy(zeroCopy);
56     listenSock->listen(10);
57     listenSock->startAccepting();
58   });
59
60   evb.loopForever();
61 }
62 } // namespace
63
64 static auto constexpr kMaxLoops = 20000;
65
66 void zeroCopyOn(unsigned /* unused */, size_t bufferSize) {
67   ZeroCopyTest test(kMaxLoops, true, bufferSize);
68   test.run();
69 }
70
71 void zeroCopyOff(unsigned /* unused */, size_t bufferSize) {
72   ZeroCopyTest test(kMaxLoops, false, bufferSize);
73   test.run();
74 }
75
76 BENCHMARK_PARAM(zeroCopyOn, 4096);
77 BENCHMARK_PARAM(zeroCopyOff, 4096);
78 BENCHMARK_DRAW_LINE()
79 BENCHMARK_PARAM(zeroCopyOn, 8192);
80 BENCHMARK_PARAM(zeroCopyOff, 8192);
81 BENCHMARK_DRAW_LINE()
82 BENCHMARK_PARAM(zeroCopyOn, 16384);
83 BENCHMARK_PARAM(zeroCopyOff, 16384);
84 BENCHMARK_DRAW_LINE()
85 BENCHMARK_PARAM(zeroCopyOn, 32768);
86 BENCHMARK_PARAM(zeroCopyOff, 32768);
87 BENCHMARK_DRAW_LINE()
88 BENCHMARK_PARAM(zeroCopyOn, 65536);
89 BENCHMARK_PARAM(zeroCopyOff, 65536);
90 BENCHMARK_DRAW_LINE()
91 BENCHMARK_PARAM(zeroCopyOn, 131072);
92 BENCHMARK_PARAM(zeroCopyOff, 131072);
93 BENCHMARK_DRAW_LINE()
94 BENCHMARK_PARAM(zeroCopyOn, 262144);
95 BENCHMARK_PARAM(zeroCopyOff, 262144);
96 BENCHMARK_DRAW_LINE()
97 BENCHMARK_PARAM(zeroCopyOn, 524288);
98 BENCHMARK_PARAM(zeroCopyOff, 524288);
99 BENCHMARK_DRAW_LINE()
100 BENCHMARK_PARAM(zeroCopyOn, 1048576);
101 BENCHMARK_PARAM(zeroCopyOff, 1048576);
102 BENCHMARK_DRAW_LINE()
103
104 DEFINE_bool(client, false, "client mode");
105 DEFINE_bool(server, false, "server mode");
106 DEFINE_bool(zeroCopy, false, "use zerocopy");
107 DEFINE_int32(numLoops, kMaxLoops, "number of loops");
108 DEFINE_int32(bufferSize, 524288, "buffer size");
109 DEFINE_int32(port, 33130, "port");
110 DEFINE_string(host, "::1", "host");
111
112 int main(int argc, char** argv) {
113   gflags::ParseCommandLineFlags(&argc, &argv, true);
114
115   if (FLAGS_client) {
116     runClient(
117         FLAGS_host,
118         FLAGS_port,
119         FLAGS_numLoops,
120         FLAGS_zeroCopy,
121         FLAGS_bufferSize);
122   } else if (FLAGS_server) {
123     runServer(FLAGS_port, FLAGS_numLoops, FLAGS_zeroCopy, FLAGS_bufferSize);
124   } else {
125     runBenchmarks();
126   }
127 }