Add create-move-invoke benchmark for folly::Function
authorAndrii Grynenko <andrii@fb.com>
Thu, 31 Mar 2016 17:31:15 +0000 (10:31 -0700)
committerFacebook Github Bot 9 <facebook-github-bot-9-bot@fb.com>
Thu, 31 Mar 2016 17:35:19 +0000 (10:35 -0700)
Summary: Adding a benchmark for one the most common scenarios (used in Futures, EventBase, fibers etc).

Reviewed By: yfeldblum

Differential Revision: D3106365

fb-gh-sync-id: 8cb55959b3803e8836ab5a5bdf43fdfc1db02d4c
fbshipit-source-id: 8cb55959b3803e8836ab5a5bdf43fdfc1db02d4c

folly/test/function_benchmark/main.cpp
folly/test/function_benchmark/test_functions.cpp
folly/test/function_benchmark/test_functions.h

index 171d7aedaba1bab028557759f7f8b725ba20c62b..4fa63e08d3b40516bd10e904129377646e6f6d11 100644 (file)
@@ -282,6 +282,40 @@ BENCHMARK(return_code_noexcept, iters) {
   }
 }
 
+BENCHMARK_DRAW_LINE()
+
+BENCHMARK(std_function_create_move_invoke, iters) {
+  LargeClass a;
+  for (size_t i = 0; i < iters; ++i) {
+    std::function<void()> f(a);
+    invoke(std::move(f));
+  }
+}
+
+BENCHMARK(Function_create_move_invoke, iters) {
+  LargeClass a;
+  for (size_t i = 0; i < iters; ++i) {
+    folly::Function<void()> f(a);
+    invoke(std::move(f));
+  }
+}
+
+BENCHMARK(std_function_create_move_invoke_ref, iters) {
+  LargeClass a;
+  for (size_t i = 0; i < iters; ++i) {
+    std::function<void()> f(std::ref(a));
+    invoke(std::move(f));
+  }
+}
+
+BENCHMARK(Function_create_move_invoke_ref, iters) {
+  LargeClass a;
+  for (size_t i = 0; i < iters; ++i) {
+    folly::Function<void()> f(std::ref(a));
+    invoke(std::move(f));
+  }
+}
+
 // main()
 
 int main(int argc, char** argv) {
index 82e1e23a6f34d56ac3fe39f4f713c67a3849e476..7da5df99cbc2397193a8a990c8fc71c8b24dfac0 100644 (file)
@@ -76,3 +76,18 @@ VirtualClass::~VirtualClass() {
 
 void VirtualClass::doNothing() {
 };
+
+LargeClass::LargeClass() {
+  // Suppress unused field warning
+  data[0] = 42;
+}
+
+void LargeClass::operator()() const {}
+
+void invoke(std::function<void()> f) {
+  f();
+}
+
+void invoke(folly::Function<void()> f) {
+  f();
+}
index a701d3c25c7693f16eefbbd8efbb5c0b18d7e6a9..382ac39da82afef03ebce15530fe2a4e2ec88bdc 100644 (file)
 #define TEST_FUNCTIONS_H_
 
 #include <exception>
+#include <functional>
 #include <string>
 
+#include <folly/Function.h>
+
 void doNothing();
 
 void throwException();
@@ -29,6 +32,8 @@ std::string returnString();
 std::string returnStringNoExcept() noexcept;
 int returnCode(int value);
 int returnCodeNoExcept(int value) noexcept;
+void invoke(std::function<void()>);
+void invoke(folly::Function<void()>);
 
 class TestClass {
  public:
@@ -41,4 +46,13 @@ class VirtualClass {
   virtual void doNothing();
 };
 
+class LargeClass {
+ public:
+  LargeClass();
+  void operator()() const; // do nothing
+ private:
+  // Avoid small object optimization.
+  char data[1024];
+};
+
 #endif // TEST_FUNCTIONS_H_