From 276290f0a96cab4b9afb8f34c02d2e7e613b86cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Pedro=20Bol=C3=ADvar=20Puente?= Date: Fri, 2 Sep 2016 09:59:57 +0200 Subject: [PATCH 1/2] Revert "Revert "Merge branch 'pr/65' into devel"" This reverts commit bc95b0f23888ffbd53dd4d5a78633811f60b0b60. --- doc/benchmarks.md | 18 +++++++++--------- examples/example1.c++ | 5 +++-- examples/example2.c++ | 5 +++-- include/nonius/benchmark.h++ | 32 ++++++++++++++++++++++++++++---- 4 files changed, 43 insertions(+), 17 deletions(-) diff --git a/doc/benchmarks.md b/doc/benchmarks.md index abfdb5c..0518f07 100644 --- a/doc/benchmarks.md +++ b/doc/benchmarks.md @@ -65,12 +65,12 @@ while the advanced callables are invoked exactly twice: once during the estimation phase, and another time during the execution phase. {% highlight cpp %} -NONIUS_BENCHMARK("simple", [] { return long_computation(); }); +NONIUS_BENCHMARK("simple") { return long_computation(); } -NONIUS_BENCHMARK("advanced", [](nonius::chronometer meter) { +NONIUS_BENCHMARK("advanced") (nonius::chronometer meter) { set_up(); meter.measure([] { return long_computation(); }); -}); +} {% endhighlight %} These advanced callables no longer consist entirely of user code to be measured. @@ -120,19 +120,19 @@ construct and destroy objects without dynamic allocation and in a way that lets you measure construction and destruction separately. {% highlight cpp %} -NONIUS_BENCHMARK("construct", [](nonius::chronometer meter) +NONIUS_BENCHMARK("construct") (nonius::chronometer meter) { std::vector> storage(meter.runs()); meter.measure([&](int i) { storage[i].construct("thing"); }); -}) +} -NONIUS_BENCHMARK("destroy", [](nonius::chronometer meter) +NONIUS_BENCHMARK("destroy") (nonius::chronometer meter) { std::vector> storage(meter.runs()); for(auto&& o : storage) o.construct("thing"); meter.measure([&](int i) { storage[i].destruct(); }); -}) +} {% endhighlight %} `nonius::storage_for` objects are just pieces of raw storage suitable for `T` @@ -170,10 +170,10 @@ Here's an example: {% highlight cpp %} // may measure nothing at all by skipping the long calculation since its // result is not used -NONIUS_BENCHMARK("no return", [] { long_calculation(); }) +NONIUS_BENCHMARK("no return") { long_calculation(); } // the result of long_calculation() is guaranteed to be computed somehow -NONIUS_BENCHMARK("with return", [] { return long_calculation(); }) +NONIUS_BENCHMARK("with return") { return long_calculation(); } {% endhighlight %} However, there's no other form of control over the optimizer whatsoever. It is diff --git a/examples/example1.c++ b/examples/example1.c++ index f41a51f..ae4b2c4 100644 --- a/examples/example1.c++ +++ b/examples/example1.c++ @@ -5,6 +5,7 @@ NONIUS_BENCHMARK("to_string(42)", []{ return std::to_string(42); }) -NONIUS_BENCHMARK("to_string(4.2)", []{ +// new syntax +NONIUS_BENCHMARK("to_string(4.2)") []{ return std::to_string(4.2); -}) +}; diff --git a/examples/example2.c++ b/examples/example2.c++ index 727cbaa..9e62816 100644 --- a/examples/example2.c++ +++ b/examples/example2.c++ @@ -19,7 +19,8 @@ NONIUS_BENCHMARK("forward_list", [](nonius::chronometer meter) { meter.measure([&](int i) { l.push_front(i); }); }) -NONIUS_BENCHMARK("forward_list", [](nonius::chronometer meter) { +// new syntax +NONIUS_BENCHMARK("forward_list") [](nonius::chronometer meter) { std::forward_list l; meter.measure([&](int i) { l.push_front(static_cast(i)); }); -}) +}; diff --git a/include/nonius/benchmark.h++ b/include/nonius/benchmark.h++ index a39d2d0..74d52ce 100644 --- a/include/nonius/benchmark.h++ +++ b/include/nonius/benchmark.h++ @@ -65,14 +65,38 @@ namespace nonius { } struct benchmark_registrar { + benchmark_registry& registry; + std::string name; + + benchmark_registrar(benchmark_registry& r, std::string n) + : registry(r) + , name(n) + {} + template - benchmark_registrar(benchmark_registry& registry, std::string name, Fun&& registrant) { - registry.emplace_back(std::move(name), std::forward(registrant)); + benchmark_registrar const& operator+ (Fun&& registrant) const { + registry.emplace_back(name, std::forward(registrant)); + return *this; } }; } // namespace nonius -#define NONIUS_BENCHMARK(name, ...) \ - namespace { static ::nonius::benchmark_registrar NONIUS_DETAIL_UNIQUE_NAME(benchmark_registrar) (::nonius::global_benchmark_registry(), name, __VA_ARGS__); } +#define NONIUS_BENCHMARK_OLD_(name, ...) \ + namespace { \ + static auto NONIUS_DETAIL_UNIQUE_NAME(benchmark_registrar) = \ + ::nonius::benchmark_registrar{::nonius::global_benchmark_registry(), name} + (__VA_ARGS__); \ + } \ + // + +#define NONIUS_BENCHMARK_NEW_(name) \ + static auto NONIUS_DETAIL_UNIQUE_NAME(benchmark_registrar) = \ + ::nonius::benchmark_registrar{::nonius::global_benchmark_registry(), name} + \ + // + +#define NONIUS_BENCHMARK_CHOOSE_(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68,_69,_70,_71,_72,_73,_74,_75,_76,_77,_78,_79,_80,_81,_82,_83,_84,_85,_86,_87,_88,_89,_90,_91,_92,_93,_94,_95,_96,_97,_98,_99,_100,_101,_102,_103,_104,_105,_106,_107,_108,_109,_110,_111,_112,_113,_114,_115,_116,_117,_118,_119,_120,_121,_122,_123,_124,_125,_126,_127,_128,N,...) N +#define NONIUS_BENCHMARK_CAT__(X1, X2) X1 ## X2 +#define NONIUS_BENCHMARK_CAT_(X1, X2) NONIUS_BENCHMARK_CAT__(X1, X2) + +#define NONIUS_BENCHMARK(...) NONIUS_BENCHMARK_CAT_(NONIUS_BENCHMARK_,NONIUS_BENCHMARK_CHOOSE_(__VA_ARGS__,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,OLD_,NEW_,ERR_))(__VA_ARGS__) #endif // NONIUS_BENCHMARK_HPP From a2890d819d0e322c9f062bdaa7a1180a96e130b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Pedro=20Bol=C3=ADvar=20Puente?= Date: Fri, 2 Sep 2016 10:00:46 +0200 Subject: [PATCH 2/2] Fix macro arguments should also not start with underscore --- include/nonius/benchmark.h++ | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/nonius/benchmark.h++ b/include/nonius/benchmark.h++ index 74d52ce..cb11846 100644 --- a/include/nonius/benchmark.h++ +++ b/include/nonius/benchmark.h++ @@ -93,7 +93,7 @@ namespace nonius { ::nonius::benchmark_registrar{::nonius::global_benchmark_registry(), name} + \ // -#define NONIUS_BENCHMARK_CHOOSE_(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68,_69,_70,_71,_72,_73,_74,_75,_76,_77,_78,_79,_80,_81,_82,_83,_84,_85,_86,_87,_88,_89,_90,_91,_92,_93,_94,_95,_96,_97,_98,_99,_100,_101,_102,_103,_104,_105,_106,_107,_108,_109,_110,_111,_112,_113,_114,_115,_116,_117,_118,_119,_120,_121,_122,_123,_124,_125,_126,_127,_128,N,...) N +#define NONIUS_BENCHMARK_CHOOSE_(p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17,p18,p19,p20,p21,p22,p23,p24,p25,p26,p27,p28,p29,p30,p31,p32,p33,p34,p35,p36,p37,p38,p39,p40,p41,p42,p43,p44,p45,p46,p47,p48,p49,p50,p51,p52,p53,p54,p55,p56,p57,p58,p59,p60,p61,p62,p63,p64,p65,p66,p67,p68,p69,p70,p71,p72,p73,p74,p75,p76,p77,p78,p79,p80,p81,p82,p83,p84,p85,p86,p87,p88,p89,p90,p91,p92,p93,p94,p95,p96,p97,p98,p99,p100,p101,p102,p103,p104,p105,p106,p107,p108,p109,p110,p111,p112,p113,p114,p115,p116,p117,p118,p119,p120,p121,p122,p123,p124,p125,p126,p127,p128,N,...) N #define NONIUS_BENCHMARK_CAT__(X1, X2) X1 ## X2 #define NONIUS_BENCHMARK_CAT_(X1, X2) NONIUS_BENCHMARK_CAT__(X1, X2)