// ----------------------------------------------------------------------------
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
virtual int OnRun();
virtual int OnExit();
+ // accessors
+ int GetNumericParameter() const { return m_numParam; }
+ const wxString& GetStringParameter() const { return m_strParam; }
+
private:
// list all registered benchmarks
void ListBenchmarks();
// command lines options/parameters
wxSortedArrayString m_toRun;
long m_numRuns,
- m_avgCount;
+ m_avgCount,
+ m_numParam;
+ wxString m_strParam;
};
+IMPLEMENT_APP_CONSOLE(BenchApp)
+
// ============================================================================
-// Bench::Function implementation
+// Bench namespace symbols implementation
// ============================================================================
Bench::Function *Bench::Function::ms_head = NULL;
+long Bench::GetNumericParameter()
+{
+ return wxGetApp().GetNumericParameter();
+}
+
+wxString Bench::GetStringParameter()
+{
+ return wxGetApp().GetStringParameter();
+}
+
// ============================================================================
// BenchApp implementation
// ============================================================================
-IMPLEMENT_APP_CONSOLE(BenchApp)
-
BenchApp::BenchApp()
{
m_avgCount = 10;
m_numRuns = 10000; // just some default (TODO: switch to time-based one)
+ m_numParam = 0;
}
bool BenchApp::OnInit()
"list",
"list all the existing benchmarks");
+ parser.AddSwitch(OPTION_SINGLE,
+ "single",
+ "run the benchmark once only");
+
parser.AddOption(OPTION_AVG_COUNT,
"avg-count",
- "number of times to run benchmarking loop",
+ wxString::Format
+ (
+ "number of times to run benchmarking loop (default: %ld)",
+ m_avgCount
+ ),
wxCMD_LINE_VAL_NUMBER);
parser.AddOption(OPTION_NUM_RUNS,
"num-runs",
- "number of times to run each benchmark in a loop",
+ wxString::Format
+ (
+ "number of times to run each benchmark in a loop "
+ "(default: %ld)",
+ m_numRuns
+ ),
+ wxCMD_LINE_VAL_NUMBER);
+ parser.AddOption(OPTION_NUMERIC_PARAM,
+ "num-param",
+ 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,
wxCMD_LINE_PARAM_OPTIONAL | wxCMD_LINE_PARAM_MULTIPLE);
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;
if ( m_toRun.Index(func->GetName()) == wxNOT_FOUND )
continue;
- wxPrintf("Benchmarking %s: ", func->GetName());
+ 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++ )
sw.Pause();
- if ( !ok )
- break;
-
const long t = sw.Time();
if ( t < timeMin )
timeMin = t;
timeTotal += t;
}
+ func->Done();
+
if ( !ok )
{
wxPrintf("ERROR\n");