Re: [test] RFC: speed up BOOST_CHECK by not formatting the check description if it isn't written anywhere

Hello,

Gennadiy Rozental wrote:

> Ji <jpalecek <at> web.de> writes:
> 
>> I have a test that uses many BOOST_CHECKs (~ 10 thousands or so). Running
>> that
> test is very slow and I have
>> noticed most of the time is spent by formatting the description string to
>> be
> passed to check_impl, only to
>> be ignored, because I don't want to log successful checks (and they are
> successful).
>> 
>> I have improved this by using some kind of expression template for this
> (called lazy_output). It works like this:
> Thanks you very much for the idea. I've implemented it a bit differently
> and extended to support manipulators. Also I've integrated it with UTF
> internals a
> bit  more. Checked into svn in 47258.

Thank you. Now, I have taken it one step further and used the same trick on the other arguments of check_impl
(that is, argument values of predicate checks). I left the CHECK_BITWISE_EQUAL and CHECK_EQUAL_COLL
taking plain old const char*, because they never take more than a string literal. The other checks'
arguments are converted to lazy_ostream const*.

Regards
    Jiri Palecek
=== boost/test/impl/test_tools.ipp
==================================================================
--- boost/test/impl/test_tools.ipp	(revision 5151)
+++ boost/test/impl/test_tools.ipp	(revision 5152)
@@ -66,6 +66,7 @@
             std::size_t num_of_args, ... )
 {
     using namespace unit_test;
+    using ::boost::unit_test::lazy_ostream;

     if( !framework::is_initialized() )
         throw std::runtime_error( "can't use testing tools before framework is initialized" );
@@ -139,16 +140,16 @@
         va_list args;

         va_start( args, num_of_args );
-        char const* arg1_descr  = va_arg( args, char const* );
-        char const* arg1_val    = va_arg( args, char const* );
-        char const* arg2_descr  = va_arg( args, char const* );
-        char const* arg2_val    = va_arg( args, char const* );
+        lazy_ostream const* arg1_descr  = va_arg( args, lazy_ostream const* );
+        lazy_ostream const* arg1_val    = va_arg( args, lazy_ostream const* );
+        lazy_ostream const* arg2_descr  = va_arg( args, lazy_ostream const* );
+        lazy_ostream const* arg2_val    = va_arg( args, lazy_ostream const* );

         unit_test_log << unit_test::log::begin( file_name, line_num ) 
-                      << ll << prefix << arg1_descr << check_str[ct-CHECK_EQUAL] << arg2_descr << suffix;
+                      << ll << prefix << *arg1_descr << check_str[ct-CHECK_EQUAL] << *arg2_descr << suffix;

         if( tl != PASS )
-            unit_test_log << " [" << arg1_val << rever_str[ct-CHECK_EQUAL] << arg2_val << "]" ;
+            unit_test_log << " [" << *arg1_val << rever_str[ct-CHECK_EQUAL] << *arg2_val << "]" ;

         va_end( args );

@@ -164,19 +165,19 @@
         va_list args;

         va_start( args, num_of_args );
-        char const* arg1_descr  = va_arg( args, char const* );
-        char const* arg1_val    = va_arg( args, char const* );
-        char const* arg2_descr  = va_arg( args, char const* );
-        char const* arg2_val    = va_arg( args, char const* );
-        /* toler_descr = */       va_arg( args, char const* );
-        char const* toler_val   = va_arg( args, char const* );
+        lazy_ostream const* arg1_descr  = va_arg( args, lazy_ostream const* );
+        lazy_ostream const* arg1_val    = va_arg( args, lazy_ostream const* );
+        lazy_ostream const* arg2_descr  = va_arg( args, lazy_ostream const* );
+        lazy_ostream const* arg2_val    = va_arg( args, lazy_ostream const* );
+        /* toler_descr = */       va_arg( args, lazy_ostream const* );
+        lazy_ostream const* toler_val   = va_arg( args, lazy_ostream const* );

         unit_test_log << unit_test::log::begin( file_name, line_num ) << ll;

-        unit_test_log << "difference between " << arg1_descr << "{" << arg1_val << "}" 
-                      << " and "               << arg2_descr << "{" << arg2_val << "}"
+        unit_test_log << "difference between " << *arg1_descr << "{" << *arg1_val << "}" 
+                      << " and "               << *arg2_descr << "{" << *arg2_val << "}"
                       << ( tl == PASS ? " doesn't exceed " : " exceeds " )
-                      << toler_val;
+                      << *toler_val;
         if( ct == CHECK_CLOSE )
             unit_test_log << "%";

@@ -192,16 +193,16 @@
         va_list args;

         va_start( args, num_of_args );
-        char const* arg1_descr  = va_arg( args, char const* );
-        char const* arg1_val    = va_arg( args, char const* );
-        /* toler_descr = */       va_arg( args, char const* );
-        char const* toler_val   = va_arg( args, char const* );
+        lazy_ostream const* arg1_descr  = va_arg( args, lazy_ostream const* );
+        lazy_ostream const* arg1_val    = va_arg( args, lazy_ostream const* );
+        /* toler_descr = */       va_arg( args, lazy_ostream const* );
+        lazy_ostream const* toler_val   = va_arg( args, lazy_ostream const* );

         unit_test_log << unit_test::log::begin( file_name, line_num ) << ll;

-        unit_test_log << "absolute value of " << arg1_descr << "{" << arg1_val << "}" 
+        unit_test_log << "absolute value of " << *arg1_descr << "{" << *arg1_val << "}" 
                       << ( tl == PASS ? " doesn't exceed " : " exceeds " )
-                      << toler_val;
+                      << *toler_val;

         va_end( args );

@@ -223,8 +224,8 @@

             unit_test_log << "( ";
             for( std::size_t i = 0; i < num_of_args; ++i ) {
-                unit_test_log << va_arg( args, char const* );
-                va_arg( args, char const* ); // skip argument value;
+                unit_test_log << *va_arg( args, lazy_ostream const* );
+                va_arg( args, lazy_ostream const* ); // skip argument value;

                 if( i != num_of_args-1 )
                     unit_test_log << ", ";
@@ -239,8 +240,8 @@

             unit_test_log << " for ( ";
             for( std::size_t i = 0; i < num_of_args; ++i ) {
-                va_arg( args, char const* ); // skip argument description;            
-                unit_test_log << va_arg( args, char const* );
+                va_arg( args, lazy_ostream const* ); // skip argument description;            
+                unit_test_log << *va_arg( args, lazy_ostream const* );

                 if( i != num_of_args-1 )
                     unit_test_log << ", ";
=== boost/test/test_tools.hpp
==================================================================
--- boost/test/test_tools.hpp	(revision 5151)
+++ boost/test/test_tools.hpp	(revision 5152)
@@ -484,10 +484,11 @@
 #define PRED_PARAMS( z, m, dummy ) BOOST_PP_COMMA_IF( m ) BOOST_JOIN( arg, m ) 

 #define ARG_INFO( z, m, dummy )                                                     \
-    , BOOST_JOIN( BOOST_JOIN( arg, m ), _descr )                                    \
-    , (boost::wrap_stringstream().ref()                                             \
-        << ::boost::test_tools::tt_detail::                                         \
-            print_helper( BOOST_JOIN( arg, m ) )).str().c_str()                     \
+  , &(const unit_test::lazy_ostream&)(unit_test::lazy_ostream::instance()           \
+     << BOOST_JOIN( BOOST_JOIN( arg, m ), _descr ))                                 \
+  , &(const unit_test::lazy_ostream&)(unit_test::lazy_ostream::instance()           \
+     << ::boost::test_tools::tt_detail::                                            \
+          print_helper( BOOST_JOIN( arg, m ) ))                                     \
 /**/

 #define IMPL_FRWD( z, n, dummy )                                                    \

_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Gmane