Measure time taken by these calls when the debug/trace messages are not enabled. See #11829. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@70434 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			110 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
/////////////////////////////////////////////////////////////////////////////
 | 
						|
// Name:        tests/benchmarks/log.cpp
 | 
						|
// Purpose:     Log-related benchmarks
 | 
						|
// Author:      Vadim Zeitlin
 | 
						|
// Created:     2012-01-21
 | 
						|
// RCS-ID:      $Id$
 | 
						|
// Copyright:   (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
 | 
						|
// Licence:     wxWindows licence
 | 
						|
/////////////////////////////////////////////////////////////////////////////
 | 
						|
 | 
						|
#include "bench.h"
 | 
						|
 | 
						|
#include "wx/log.h"
 | 
						|
 | 
						|
// This class is used to check that the arguments of log functions are not
 | 
						|
// evaluated.
 | 
						|
struct NotCreated
 | 
						|
{
 | 
						|
    NotCreated() { wxAbort(); }
 | 
						|
 | 
						|
    const char* AsStr() const { return "unreachable"; }
 | 
						|
};
 | 
						|
 | 
						|
// Temporarily change the log level to the given one.
 | 
						|
class LogLevelSetter
 | 
						|
{
 | 
						|
public:
 | 
						|
    LogLevelSetter(wxLogLevel levelNew)
 | 
						|
        : m_levelOld(wxLog::GetLogLevel())
 | 
						|
    {
 | 
						|
        wxLog::SetLogLevel(levelNew);
 | 
						|
    }
 | 
						|
 | 
						|
    ~LogLevelSetter()
 | 
						|
    {
 | 
						|
        wxLog::SetLogLevel(m_levelOld);
 | 
						|
    }
 | 
						|
 | 
						|
private:
 | 
						|
    const wxLogLevel m_levelOld;
 | 
						|
 | 
						|
    wxDECLARE_NO_COPY_CLASS(LogLevelSetter);
 | 
						|
};
 | 
						|
 | 
						|
BENCHMARK_FUNC(LogDebugDisabled)
 | 
						|
{
 | 
						|
    LogLevelSetter level(wxLOG_Info);
 | 
						|
 | 
						|
    wxLogDebug("Ignored debug message: %s", NotCreated().AsStr());
 | 
						|
 | 
						|
    return true;
 | 
						|
}
 | 
						|
 | 
						|
BENCHMARK_FUNC(LogTraceDisabled)
 | 
						|
{
 | 
						|
    LogLevelSetter level(wxLOG_Info);
 | 
						|
 | 
						|
    wxLogTrace("", NotCreated().AsStr());
 | 
						|
 | 
						|
    return true;
 | 
						|
}
 | 
						|
 | 
						|
BENCHMARK_FUNC(LogTraceActive)
 | 
						|
{
 | 
						|
    static bool s_added = false;
 | 
						|
    if ( !s_added )
 | 
						|
    {
 | 
						|
        s_added = true;
 | 
						|
        wxLog::AddTraceMask("logbench");
 | 
						|
    }
 | 
						|
 | 
						|
    // Remove the actual logging overhead by simply throwing away the log
 | 
						|
    // messages.
 | 
						|
    class NulLog : public wxLog
 | 
						|
    {
 | 
						|
    public:
 | 
						|
        NulLog()
 | 
						|
            : m_logOld(wxLog::SetActiveTarget(this))
 | 
						|
        {
 | 
						|
        }
 | 
						|
 | 
						|
        virtual ~NulLog()
 | 
						|
        {
 | 
						|
            wxLog::SetActiveTarget(m_logOld);
 | 
						|
        }
 | 
						|
 | 
						|
    protected:
 | 
						|
        virtual void DoLogRecord(wxLogLevel,
 | 
						|
                                 const wxString&,
 | 
						|
                                 const wxLogRecordInfo&)
 | 
						|
        {
 | 
						|
        }
 | 
						|
 | 
						|
        wxLog* m_logOld;
 | 
						|
    };
 | 
						|
 | 
						|
    NulLog nulLog;
 | 
						|
 | 
						|
    wxLogTrace("logbench", "Trace message");
 | 
						|
 | 
						|
    return true;
 | 
						|
}
 | 
						|
 | 
						|
BENCHMARK_FUNC(LogTraceInactive)
 | 
						|
{
 | 
						|
    wxLogTrace("bloordyblop", "Trace message");
 | 
						|
 | 
						|
    return true;
 | 
						|
}
 |