From 034d1bd92c306d854a4acf92ebc9b3181a0bbded Mon Sep 17 00:00:00 2001 From: Michael Lee Date: Tue, 16 Aug 2016 16:47:09 -0700 Subject: [PATCH] Split up FibersTest into test and Benchmark. Summary: And clean up the extra main.cpp Reviewed By: yfeldblum Differential Revision: D3717445 fbshipit-source-id: 2a5d554824c454b5339514d0d4ca7ae9474abdb9 --- folly/fibers/FiberManager.h | 2 +- folly/fibers/test/FibersBenchmark.cpp | 136 ++++++++++++++++++++++++++ folly/fibers/test/FibersTest.cpp | 103 ------------------- folly/fibers/test/main.cpp | 33 ------- 4 files changed, 137 insertions(+), 137 deletions(-) create mode 100644 folly/fibers/test/FibersBenchmark.cpp delete mode 100644 folly/fibers/test/main.cpp diff --git a/folly/fibers/FiberManager.h b/folly/fibers/FiberManager.h index 25ee78c1..558dce6f 100644 --- a/folly/fibers/FiberManager.h +++ b/folly/fibers/FiberManager.h @@ -570,4 +570,4 @@ inline void yield() { } } -#include "FiberManager-inl.h" +#include diff --git a/folly/fibers/test/FibersBenchmark.cpp b/folly/fibers/test/FibersBenchmark.cpp new file mode 100644 index 00000000..8bd9d967 --- /dev/null +++ b/folly/fibers/test/FibersBenchmark.cpp @@ -0,0 +1,136 @@ +/* + * Copyright 2016 Facebook, Inc. + * + * 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 +#include + +#include + +#include +#include +#include +#include + +using namespace folly::fibers; + +static size_t sNumAwaits; + +void runBenchmark(size_t numAwaits, size_t toSend) { + sNumAwaits = numAwaits; + + FiberManager fiberManager(folly::make_unique()); + auto& loopController = + dynamic_cast(fiberManager.loopController()); + + std::queue> pendingRequests; + static const size_t maxOutstanding = 5; + + auto loop = [&fiberManager, &loopController, &pendingRequests, &toSend]() { + if (pendingRequests.size() == maxOutstanding || toSend == 0) { + if (pendingRequests.empty()) { + return; + } + pendingRequests.front().setValue(0); + pendingRequests.pop(); + } else { + fiberManager.addTask([&pendingRequests]() { + for (size_t i = 0; i < sNumAwaits; ++i) { + auto result = await([&pendingRequests](Promise promise) { + pendingRequests.push(std::move(promise)); + }); + DCHECK_EQ(result, 0); + } + }); + + if (--toSend == 0) { + loopController.stop(); + } + } + }; + + loopController.loop(std::move(loop)); +} + +BENCHMARK(FiberManagerBasicOneAwait, iters) { + runBenchmark(1, iters); +} + +BENCHMARK(FiberManagerBasicFiveAwaits, iters) { + runBenchmark(5, iters); +} + +BENCHMARK(FiberManagerCreateDestroy, iters) { + for (size_t i = 0; i < iters; ++i) { + folly::EventBase evb; + auto& fm = folly::fibers::getFiberManager(evb); + fm.addTask([]() {}); + evb.loop(); + } +} + +BENCHMARK(FiberManagerAllocateDeallocatePattern, iters) { + static const size_t kNumAllocations = 10000; + + FiberManager::Options opts; + opts.maxFibersPoolSize = 0; + + FiberManager fiberManager(folly::make_unique(), opts); + + for (size_t iter = 0; iter < iters; ++iter) { + DCHECK_EQ(0, fiberManager.fibersPoolSize()); + + size_t fibersRun = 0; + + for (size_t i = 0; i < kNumAllocations; ++i) { + fiberManager.addTask([&fibersRun] { ++fibersRun; }); + fiberManager.loopUntilNoReady(); + } + + DCHECK_EQ(10000, fibersRun); + DCHECK_EQ(0, fiberManager.fibersPoolSize()); + } +} + +BENCHMARK(FiberManagerAllocateLargeChunk, iters) { + static const size_t kNumAllocations = 10000; + + FiberManager::Options opts; + opts.maxFibersPoolSize = 0; + + FiberManager fiberManager(folly::make_unique(), opts); + + for (size_t iter = 0; iter < iters; ++iter) { + DCHECK_EQ(0, fiberManager.fibersPoolSize()); + + size_t fibersRun = 0; + + for (size_t i = 0; i < kNumAllocations; ++i) { + fiberManager.addTask([&fibersRun] { ++fibersRun; }); + } + + fiberManager.loopUntilNoReady(); + + DCHECK_EQ(10000, fibersRun); + DCHECK_EQ(0, fiberManager.fibersPoolSize()); + } +} + +int main(int argc, char** argv) { + folly::init(&argc, &argv, true); + + folly::runBenchmarks(); + return 0; +} diff --git a/folly/fibers/test/FibersTest.cpp b/folly/fibers/test/FibersTest.cpp index e962145a..dcdd5d79 100644 --- a/folly/fibers/test/FibersTest.cpp +++ b/folly/fibers/test/FibersTest.cpp @@ -19,7 +19,6 @@ #include -#include #include #include @@ -1540,105 +1539,3 @@ TEST(FiberManager, nestedFiberManagers) { outerEvb.loopForever(); } - -static size_t sNumAwaits; - -void runBenchmark(size_t numAwaits, size_t toSend) { - sNumAwaits = numAwaits; - - FiberManager fiberManager(folly::make_unique()); - auto& loopController = - dynamic_cast(fiberManager.loopController()); - - std::queue> pendingRequests; - static const size_t maxOutstanding = 5; - - auto loop = [&fiberManager, &loopController, &pendingRequests, &toSend]() { - if (pendingRequests.size() == maxOutstanding || toSend == 0) { - if (pendingRequests.empty()) { - return; - } - pendingRequests.front().setValue(0); - pendingRequests.pop(); - } else { - fiberManager.addTask([&pendingRequests]() { - for (size_t i = 0; i < sNumAwaits; ++i) { - auto result = await([&pendingRequests](Promise promise) { - pendingRequests.push(std::move(promise)); - }); - DCHECK_EQ(result, 0); - } - }); - - if (--toSend == 0) { - loopController.stop(); - } - } - }; - - loopController.loop(std::move(loop)); -} - -BENCHMARK(FiberManagerBasicOneAwait, iters) { - runBenchmark(1, iters); -} - -BENCHMARK(FiberManagerBasicFiveAwaits, iters) { - runBenchmark(5, iters); -} - -BENCHMARK(FiberManagerCreateDestroy, iters) { - for (size_t i = 0; i < iters; ++i) { - folly::EventBase evb; - auto& fm = folly::fibers::getFiberManager(evb); - fm.addTask([]() {}); - evb.loop(); - } -} - -BENCHMARK(FiberManagerAllocateDeallocatePattern, iters) { - static const size_t kNumAllocations = 10000; - - FiberManager::Options opts; - opts.maxFibersPoolSize = 0; - - FiberManager fiberManager(folly::make_unique(), opts); - - for (size_t iter = 0; iter < iters; ++iter) { - EXPECT_EQ(0, fiberManager.fibersPoolSize()); - - size_t fibersRun = 0; - - for (size_t i = 0; i < kNumAllocations; ++i) { - fiberManager.addTask([&fibersRun] { ++fibersRun; }); - fiberManager.loopUntilNoReady(); - } - - EXPECT_EQ(10000, fibersRun); - EXPECT_EQ(0, fiberManager.fibersPoolSize()); - } -} - -BENCHMARK(FiberManagerAllocateLargeChunk, iters) { - static const size_t kNumAllocations = 10000; - - FiberManager::Options opts; - opts.maxFibersPoolSize = 0; - - FiberManager fiberManager(folly::make_unique(), opts); - - for (size_t iter = 0; iter < iters; ++iter) { - EXPECT_EQ(0, fiberManager.fibersPoolSize()); - - size_t fibersRun = 0; - - for (size_t i = 0; i < kNumAllocations; ++i) { - fiberManager.addTask([&fibersRun] { ++fibersRun; }); - } - - fiberManager.loopUntilNoReady(); - - EXPECT_EQ(10000, fibersRun); - EXPECT_EQ(0, fiberManager.fibersPoolSize()); - } -} diff --git a/folly/fibers/test/main.cpp b/folly/fibers/test/main.cpp deleted file mode 100644 index ac94a9ed..00000000 --- a/folly/fibers/test/main.cpp +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2016 Facebook, Inc. - * - * 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 - -#include - -// for backward compatibility with gflags -namespace gflags {} -namespace google { -using namespace gflags; -} - -int main(int argc, char** argv) { - testing::InitGoogleTest(&argc, argv); - gflags::ParseCommandLineFlags(&argc, &argv, true); - - auto rc = RUN_ALL_TESTS(); - folly::runBenchmarksOnFlag(); - return rc; -} -- 2.34.1