12 Jul 18:50
Re: [test] RFC: speed up BOOST_CHECK by not formatting the check description if it isn't written anywhere
From: =??B?Smn47SBQYWxl6GVr?= <jpalecek <at> web.de>
Subject: Re: [test] RFC: speed up BOOST_CHECK by not formatting the check description if it isn't written anywhere
Newsgroups: gmane.comp.lib.boost.devel
Date: 2008-07-12 16:50:26 GMT
Subject: Re: [test] RFC: speed up BOOST_CHECK by not formatting the check description if it isn't written anywhere
Newsgroups: gmane.comp.lib.boost.devel
Date: 2008-07-12 16:50:26 GMT
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
RSS Feed