From: Andrii Grynenko Date: Thu, 31 Mar 2016 17:31:15 +0000 (-0700) Subject: Add create-move-invoke benchmark for folly::Function X-Git-Tag: 2016.07.26~392 X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=7f38b123246acccf552a8150992883cbcc21ba29;p=folly.git Add create-move-invoke benchmark for folly::Function 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 --- diff --git a/folly/test/function_benchmark/main.cpp b/folly/test/function_benchmark/main.cpp index 171d7aed..4fa63e08 100644 --- a/folly/test/function_benchmark/main.cpp +++ b/folly/test/function_benchmark/main.cpp @@ -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 f(a); + invoke(std::move(f)); + } +} + +BENCHMARK(Function_create_move_invoke, iters) { + LargeClass a; + for (size_t i = 0; i < iters; ++i) { + folly::Function 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 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 f(std::ref(a)); + invoke(std::move(f)); + } +} + // main() int main(int argc, char** argv) { diff --git a/folly/test/function_benchmark/test_functions.cpp b/folly/test/function_benchmark/test_functions.cpp index 82e1e23a..7da5df99 100644 --- a/folly/test/function_benchmark/test_functions.cpp +++ b/folly/test/function_benchmark/test_functions.cpp @@ -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 f) { + f(); +} + +void invoke(folly::Function f) { + f(); +} diff --git a/folly/test/function_benchmark/test_functions.h b/folly/test/function_benchmark/test_functions.h index a701d3c2..382ac39d 100644 --- a/folly/test/function_benchmark/test_functions.h +++ b/folly/test/function_benchmark/test_functions.h @@ -18,8 +18,11 @@ #define TEST_FUNCTIONS_H_ #include +#include #include +#include + 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 invoke(folly::Function); 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_