Use "auto" with GENERATOR instead of std::function
[folly.git] / folly / gen / test / BaseBenchmark.cpp
index f11fef0f07bff442fdebf734765f7d75657ffbda..51058b71b960dba0dfba9d59320c127e2d825da6 100644 (file)
@@ -140,11 +140,11 @@ BENCHMARK_DRAW_LINE()
 BENCHMARK(Fib_Sum_NoGen, iters) {
   int s = 0;
   while (iters--) {
-    auto fib = [](int limit) -> vector<int> {
+    auto fib = [](size_t limit) -> vector<int> {
       vector<int> ret;
       int a = 0;
       int b = 1;
-      for (int i = 0; i * 2 < limit; ++i) {
+      for (size_t i = 0; i < limit; i += 2) {
         ret.push_back(a += b);
         ret.push_back(b += a);
       }
@@ -168,11 +168,30 @@ BENCHMARK_RELATIVE(Fib_Sum_Gen, iters) {
         yield(b += a);
       }
     };
+    // Early stopping implemented with exceptions.
     s += fib | take(testSize.load()) | sum;
   }
   folly::doNotOptimizeAway(s);
 }
 
+BENCHMARK_RELATIVE(Fib_Sum_Gen_Limit, iters) {
+  int s = 0;
+  while (iters--) {
+    size_t limit = testSize.load();
+    auto fib = GENERATOR(int) {
+      int a = 0;
+      int b = 1;
+      for (size_t i = 0; i < limit; i += 2) {
+        yield(a += b);
+        yield(b += a);
+      }
+    };
+    // No early stopping.
+    s += fib | sum;
+  }
+  folly::doNotOptimizeAway(s);
+}
+
 struct FibYielder {
   template <class Yield>
   void operator()(Yield&& yield) const {