Fibers allocation/deallocation benchmarks
authorJon Maltiel Swenson <jmswen@fb.com>
Fri, 23 Oct 2015 21:44:22 +0000 (14:44 -0700)
committerfacebook-github-bot-4 <folly-bot@fb.com>
Fri, 23 Oct 2015 22:20:19 +0000 (15:20 -0700)
Summary: Add a couple benchmarks measuring allocation/deallocation latency.  One benchmark measures an allocate-deallocate repeated pattern, the other measures the allocation of a large chunk of fibers.

We'll use these benchmarks later on after we modify the allocation/deallocation behavior of fibers.

Reviewed By: pavlo-fb

Differential Revision: D2573064

fb-gh-sync-id: 414eb93d6223e42c187c03214a47dfb533491bab

folly/experimental/fibers/test/FibersTest.cpp

index 6adf2831df41f242bb5d38a6295456893f968ff9..874bf7df4af37d56eca921c30cb44f926e968831 100644 (file)
@@ -1449,3 +1449,58 @@ BENCHMARK(FiberManagerBasicOneAwait, iters) {
 BENCHMARK(FiberManagerBasicFiveAwaits, iters) {
   runBenchmark(5, iters);
 }
+
+BENCHMARK(FiberManagerAllocateDeallocatePattern, iters) {
+  static const size_t kNumAllocations = 10000;
+
+  FiberManager::Options opts;
+  opts.maxFibersPoolSize = 0;
+
+  FiberManager fiberManager(folly::make_unique<SimpleLoopController>(), 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<SimpleLoopController>(), 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());
+  }
+}