diff --git a/tests/benchmarks/bench.cpp b/tests/benchmarks/bench.cpp index 04723a65b7..0d694e7826 100644 --- a/tests/benchmarks/bench.cpp +++ b/tests/benchmarks/bench.cpp @@ -254,8 +254,8 @@ int BenchApp::OnRun() 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++ ) @@ -265,9 +265,6 @@ int BenchApp::OnRun() sw.Pause(); - if ( !ok ) - break; - const long t = sw.Time(); if ( t < timeMin ) timeMin = t; @@ -276,6 +273,8 @@ int BenchApp::OnRun() timeTotal += t; } + func->Done(); + if ( !ok ) { wxPrintf("ERROR\n"); diff --git a/tests/benchmarks/bench.h b/tests/benchmarks/bench.h index 21d95a4281..8b1ef764e5 100644 --- a/tests/benchmarks/bench.h +++ b/tests/benchmarks/bench.h @@ -25,12 +25,19 @@ namespace Bench class Function { public: - typedef bool (*Type)(); + typedef bool (*InitType)(); + typedef bool (*FuncType)(); + typedef void (*DoneType)(); /// Ctor is used implicitly by BENCHMARK_FUNC(). - Function(const char *name, Type func) + Function(const char *name, + FuncType func, + InitType init = NULL, + DoneType done = NULL) : m_name(name), m_func(func), + m_init(init), + m_done(done), m_next(ms_head) { ms_head = this; @@ -39,9 +46,14 @@ public: /// Get the name of this function const char *GetName() const { return m_name; } + /// Perform once-only initialization prior to Run(). + bool Init() { return m_init ? (*m_init)() : true; } + /// Run the function, return its return value. bool Run() { return (*m_func)(); } + /// Clean up after performing the benchmark. + void Done() { if ( m_done ) (*m_done)(); } /// Get the head of the linked list of benchmark objects static Function *GetFirst() { return ms_head; } @@ -55,7 +67,9 @@ private: // name of and pointer to the function, as passed to the ctor const char * const m_name; - const Type m_func; + const FuncType m_func; + const InitType m_init; + const DoneType m_done; // pointer to the next object in the linked list or NULL Function * const m_next; @@ -98,4 +112,15 @@ wxString GetStringParameter(); static Bench::Function wxMAKE_UNIQUE_NAME(name)(#name, name); \ bool name() +/** + Define a benchmark function requiring initialization and shutdown. + + This macro is similar to BENCHMARK_FUNC() but ensures that @a init is + called before the benchmark is ran and @a done afterwards. + */ +#define BENCHMARK_FUNC_WITH_INIT(name, init, done) \ + static bool name(); \ + static Bench::Function wxMAKE_UNIQUE_NAME(name)(#name, name, init, done); \ + bool name() + #endif // _WX_TESTS_BENCHMARKS_BENCH_H_