X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/8fad8b2e523579570274d9a8ee561a038dec5cab..32cdc45397d8c0a24735f84e1dcf83bba1980f2d:/tests/benchmarks/bench.cpp diff --git a/tests/benchmarks/bench.cpp b/tests/benchmarks/bench.cpp index 9fe61f52fa..0d694e7826 100644 --- a/tests/benchmarks/bench.cpp +++ b/tests/benchmarks/bench.cpp @@ -27,10 +27,12 @@ // ---------------------------------------------------------------------------- static const char OPTION_LIST = 'l'; +static const char OPTION_SINGLE = '1'; static const char OPTION_AVG_COUNT = 'a'; static const char OPTION_NUM_RUNS = 'n'; static const char OPTION_NUMERIC_PARAM = 'p'; +static const char OPTION_STRING_PARAM = 's'; // ---------------------------------------------------------------------------- // BenchApp declaration @@ -54,8 +56,9 @@ public: virtual int OnRun(); virtual int OnExit(); - // accessor + // accessors int GetNumericParameter() const { return m_numParam; } + const wxString& GetStringParameter() const { return m_strParam; } private: // list all registered benchmarks @@ -66,6 +69,7 @@ private: long m_numRuns, m_avgCount, m_numParam; + wxString m_strParam; }; IMPLEMENT_APP_CONSOLE(BenchApp) @@ -81,6 +85,11 @@ long Bench::GetNumericParameter() return wxGetApp().GetNumericParameter(); } +wxString Bench::GetStringParameter() +{ + return wxGetApp().GetStringParameter(); +} + // ============================================================================ // BenchApp implementation // ============================================================================ @@ -89,7 +98,7 @@ BenchApp::BenchApp() { m_avgCount = 10; m_numRuns = 10000; // just some default (TODO: switch to time-based one) - m_numParam = 1; + m_numParam = 0; } bool BenchApp::OnInit() @@ -116,6 +125,10 @@ void BenchApp::OnInitCmdLine(wxCmdLineParser& parser) "list", "list all the existing benchmarks"); + parser.AddSwitch(OPTION_SINGLE, + "single", + "run the benchmark once only"); + parser.AddOption(OPTION_AVG_COUNT, "avg-count", wxString::Format @@ -135,9 +148,18 @@ void BenchApp::OnInitCmdLine(wxCmdLineParser& parser) wxCMD_LINE_VAL_NUMBER); parser.AddOption(OPTION_NUMERIC_PARAM, "num-param", - "numeric parameter used by some benchmark functions " - "(default: 1)", + wxString::Format + ( + "numeric parameter used by some benchmark functions " + "(default: %ld)", + m_numParam + ), wxCMD_LINE_VAL_NUMBER); + parser.AddOption(OPTION_STRING_PARAM, + "str-param", + "string parameter used by some benchmark functions " + "(default: empty)", + wxCMD_LINE_VAL_STRING); parser.AddParam("benchmark name", wxCMD_LINE_VAL_STRING, @@ -163,9 +185,25 @@ bool BenchApp::OnCmdLineParsed(wxCmdLineParser& parser) return false; } - parser.Found(OPTION_AVG_COUNT, &m_avgCount); - parser.Found(OPTION_NUM_RUNS, &m_numRuns); + bool numRunsSpecified = false; + if ( parser.Found(OPTION_AVG_COUNT, &m_avgCount) ) + numRunsSpecified = true; + if ( parser.Found(OPTION_NUM_RUNS, &m_numRuns) ) + numRunsSpecified = true; parser.Found(OPTION_NUMERIC_PARAM, &m_numParam); + parser.Found(OPTION_STRING_PARAM, &m_strParam); + if ( parser.Found(OPTION_SINGLE) ) + { + if ( numRunsSpecified ) + { + wxFprintf(stderr, "Incompatible options specified.\n"); + + return false; + } + + m_avgCount = + m_numRuns = 1; + } // construct sorted array for quick verification of benchmark names wxSortedArrayString benchmarks; @@ -201,13 +239,23 @@ int BenchApp::OnRun() if ( m_toRun.Index(func->GetName()) == wxNOT_FOUND ) continue; - wxPrintf("Benchmarking %s(%ld): ", func->GetName(), m_numParam); + wxString params; + if ( m_numParam ) + params += wxString::Format(" with N=%ld", m_numParam); + if ( !m_strParam.empty() ) + { + if ( !params.empty() ) + params += " and"; + params += wxString::Format(" with s=\"%s\"", m_strParam); + } + + wxPrintf("Benchmarking %s%s: ", func->GetName(), params); long timeMin = LONG_MAX, timeMax = 0, timeTotal = 0; - bool ok = true; - for ( long a = 0; a < m_avgCount; a++ ) + bool ok = func->Init(); + for ( long a = 0; ok && a < m_avgCount; a++ ) { wxStopWatch sw; for ( long n = 0; n < m_numRuns && ok; n++ ) @@ -217,9 +265,6 @@ int BenchApp::OnRun() sw.Pause(); - if ( !ok ) - break; - const long t = sw.Time(); if ( t < timeMin ) timeMin = t; @@ -228,6 +273,8 @@ int BenchApp::OnRun() timeTotal += t; } + func->Done(); + if ( !ok ) { wxPrintf("ERROR\n");