}
}
+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) {
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();
+}
#define TEST_FUNCTIONS_H_
#include <exception>
+#include <functional>
#include <string>
+#include <folly/Function.h>
+
void doNothing();
void throwException();
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:
virtual void doNothing();
};
+class LargeClass {
+ public:
+ LargeClass();
+ void operator()() const; // do nothing
+ private:
+ // Avoid small object optimization.
+ char data[1024];
+};
+
#endif // TEST_FUNCTIONS_H_