Performance improvement in AssertionInfo.

By using char const * instead of std::string we avoid significant
copying per assertion.  In a simple loop with 10000000 CHECKS on
my system, this reduces the run time from 9.8s to 5.8s.

This change is at the expense of no longer capturing the second arg,
which no currently existing test notices.
This commit is contained in:
Neal Coombes 2017-06-21 13:34:58 -05:00
parent 017a63da62
commit 442ad5eb0f
4 changed files with 14 additions and 14 deletions

View File

@ -40,14 +40,14 @@ namespace Catch {
struct AssertionInfo struct AssertionInfo
{ {
AssertionInfo() {} AssertionInfo() {}
AssertionInfo( std::string const& _macroName, AssertionInfo( char const * _macroName,
SourceLineInfo const& _lineInfo, SourceLineInfo const& _lineInfo,
std::string const& _capturedExpression, char const * _capturedExpression,
ResultDisposition::Flags _resultDisposition ); ResultDisposition::Flags _resultDisposition );
std::string macroName; char const * macroName;
SourceLineInfo lineInfo; SourceLineInfo lineInfo;
std::string capturedExpression; char const * capturedExpression;
ResultDisposition::Flags resultDisposition; ResultDisposition::Flags resultDisposition;
}; };

View File

@ -13,9 +13,9 @@
namespace Catch { namespace Catch {
AssertionInfo::AssertionInfo( std::string const& _macroName, AssertionInfo::AssertionInfo( char const * _macroName,
SourceLineInfo const& _lineInfo, SourceLineInfo const& _lineInfo,
std::string const& _capturedExpression, char const * _capturedExpression,
ResultDisposition::Flags _resultDisposition ) ResultDisposition::Flags _resultDisposition )
: macroName( _macroName ), : macroName( _macroName ),
lineInfo( _lineInfo ), lineInfo( _lineInfo ),
@ -47,7 +47,7 @@ namespace Catch {
} }
bool AssertionResult::hasExpression() const { bool AssertionResult::hasExpression() const {
return !m_info.capturedExpression.empty(); return m_info.capturedExpression[0] != 0;
} }
bool AssertionResult::hasMessage() const { bool AssertionResult::hasMessage() const {
@ -61,10 +61,10 @@ namespace Catch {
return m_info.capturedExpression; return m_info.capturedExpression;
} }
std::string AssertionResult::getExpressionInMacro() const { std::string AssertionResult::getExpressionInMacro() const {
if( m_info.macroName.empty() ) if( m_info.macroName[0] == 0 )
return m_info.capturedExpression; return m_info.capturedExpression;
else else
return m_info.macroName + "( " + m_info.capturedExpression + " )"; return std::string(m_info.macroName) + "( " + m_info.capturedExpression + " )";
} }
bool AssertionResult::hasExpandedExpression() const { bool AssertionResult::hasExpandedExpression() const {

View File

@ -28,7 +28,7 @@ namespace Catch {
char const* capturedExpression, char const* capturedExpression,
ResultDisposition::Flags resultDisposition, ResultDisposition::Flags resultDisposition,
char const* secondArg ) char const* secondArg )
: m_assertionInfo( macroName, lineInfo, capturedExpressionWithSecondArgument( capturedExpression, secondArg ), resultDisposition ), : m_assertionInfo( macroName, lineInfo, capturedExpression, resultDisposition ),
m_shouldDebugBreak( false ), m_shouldDebugBreak( false ),
m_shouldThrow( false ), m_shouldThrow( false ),
m_guardException( false ) m_guardException( false )

View File

@ -150,7 +150,7 @@ namespace Catch {
static_cast<void>(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals))); static_cast<void>(m_reporter->assertionEnded(AssertionStats(result, m_messages, m_totals)));
// Reset working state // Reset working state
m_lastAssertionInfo = AssertionInfo( std::string(), m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition ); m_lastAssertionInfo = AssertionInfo( "", m_lastAssertionInfo.lineInfo, "{Unknown expression after the reported line}" , m_lastAssertionInfo.resultDisposition );
m_lastResult = result; m_lastResult = result;
} }
@ -280,7 +280,7 @@ namespace Catch {
double duration = 0; double duration = 0;
m_shouldReportUnexpected = true; m_shouldReportUnexpected = true;
try { try {
m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, std::string(), ResultDisposition::Normal ); m_lastAssertionInfo = AssertionInfo( "TEST_CASE", testCaseInfo.lineInfo, "", ResultDisposition::Normal );
seedRng( *m_config ); seedRng( *m_config );
@ -332,9 +332,9 @@ namespace Catch {
private: private:
ResultBuilder makeUnexpectedResultBuilder() const { ResultBuilder makeUnexpectedResultBuilder() const {
return ResultBuilder( m_lastAssertionInfo.macroName.c_str(), return ResultBuilder( m_lastAssertionInfo.macroName,
m_lastAssertionInfo.lineInfo, m_lastAssertionInfo.lineInfo,
m_lastAssertionInfo.capturedExpression.c_str(), m_lastAssertionInfo.capturedExpression,
m_lastAssertionInfo.resultDisposition ); m_lastAssertionInfo.resultDisposition );
} }