summaryrefslogtreecommitdiff
path: root/libs/context/performance/fcontext/performance_fcontext.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/context/performance/fcontext/performance_fcontext.cpp')
-rw-r--r--libs/context/performance/fcontext/performance_fcontext.cpp89
1 files changed, 77 insertions, 12 deletions
diff --git a/libs/context/performance/fcontext/performance_fcontext.cpp b/libs/context/performance/fcontext/performance_fcontext.cpp
index e8dbae240..3e370c136 100644
--- a/libs/context/performance/fcontext/performance_fcontext.cpp
+++ b/libs/context/performance/fcontext/performance_fcontext.cpp
@@ -27,11 +27,25 @@ boost::uint64_t jobs = 1000;
boost::context::fcontext_t fcm = 0;
boost::context::fcontext_t fc = 0;
-static void fn( intptr_t)
-{ while ( true) boost::context::jump_fcontext( & fc, fcm, 7, preserve_fpu); }
+#if __cplusplus >= 201103L
+boost::context::execution_context * mctx = nullptr;
+#endif
-duration_type measure_time()
-{
+static void foo( intptr_t) {
+ while ( true) {
+ boost::context::jump_fcontext( & fc, fcm, 7, preserve_fpu);
+ }
+}
+
+#if __cplusplus >= 201103L
+static void bar() {
+ while ( true) {
+ mctx->resume();
+ }
+}
+#endif
+
+duration_type measure_time_fc() {
// cache warum-up
boost::context::jump_fcontext( & fcm, fc, 7, preserve_fpu);
@@ -47,9 +61,30 @@ duration_type measure_time()
return total;
}
+#if __cplusplus >= 201103L
+duration_type measure_time_ec() {
+ boost::context::execution_context ctx( boost::context::execution_context::current() );
+ mctx = & ctx;
+ // cache warum-up
+ boost::context::fixedsize_stack alloc;
+ boost::context::execution_context ectx( alloc, bar);
+ ectx.resume();
+
+ time_point_type start( clock_type::now() );
+ for ( std::size_t i = 0; i < jobs; ++i) {
+ ectx.resume();
+ }
+ duration_type total = clock_type::now() - start;
+ total -= overhead_clock(); // overhead of measurement
+ total /= jobs; // loops
+ total /= 2; // 2x jump_fcontext
+
+ return total;
+}
+#endif
+
#ifdef BOOST_CONTEXT_CYCLE
-cycle_type measure_cycles()
-{
+cycle_type measure_cycles_fc() {
// cache warum-up
boost::context::jump_fcontext( & fcm, fc, 7, preserve_fpu);
@@ -64,6 +99,28 @@ cycle_type measure_cycles()
return total;
}
+
+# if __cplusplus >= 201103L
+cycle_type measure_cycles_ec() {
+ boost::context::execution_context ctx( boost::context::execution_context::current() );
+ mctx = & ctx;
+ // cache warum-up
+ boost::context::fixedsize_stack alloc;
+ boost::context::execution_context ectx( alloc, bar);
+ ectx.resume();
+
+ cycle_type start( cycles() );
+ for ( std::size_t i = 0; i < jobs; ++i) {
+ ectx.resume();
+ }
+ cycle_type total = cycles() - start;
+ total -= overhead_cycle(); // overhead of measurement
+ total /= jobs; // loops
+ total /= 2; // 2x jump_fcontext
+
+ return total;
+}
+# endif
#endif
int main( int argc, char * argv[])
@@ -96,13 +153,21 @@ int main( int argc, char * argv[])
fc = boost::context::make_fcontext(
stack_alloc.allocate( stack_allocator::default_stacksize() ),
stack_allocator::default_stacksize(),
- fn);
-
- boost::uint64_t res = measure_time().count();
- std::cout << "average of " << res << " nano seconds" << std::endl;
+ foo);
+
+ boost::uint64_t res = measure_time_fc().count();
+ std::cout << "fcontext_t: average of " << res << " nano seconds" << std::endl;
+# if __cplusplus >= 201103L
+ res = measure_time_ec().count();
+ std::cout << "execution_context: average of " << res << " nano seconds" << std::endl;
+# endif
#ifdef BOOST_CONTEXT_CYCLE
- res = measure_cycles();
- std::cout << "average of " << res << " cpu cycles" << std::endl;
+ res = measure_cycles_fc();
+ std::cout << "fcontext_t: average of " << res << " cpu cycles" << std::endl;
+# if __cplusplus >= 201103L
+ res = measure_cycles_ec();
+ std::cout << "execution_context: average of " << res << " cpu cycles" << std::endl;
+# endif
#endif
return EXIT_SUCCESS;