]> git.saurik.com Git - wxWidgets.git/blobdiff - tests/benchmarks/bench.cpp
make the test really use the different socket flags and disable the use of wxSOCKET_N...
[wxWidgets.git] / tests / benchmarks / bench.cpp
index 67005abab86db6cb0b3385bdc002c586f7409985..0d694e78262ffdb59d1e01145cf425526d3f25e4 100644 (file)
 // ----------------------------------------------------------------------------
 
 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
@@ -53,6 +56,10 @@ public:
     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();
@@ -60,25 +67,38 @@ private:
     // 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()
@@ -105,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
@@ -122,6 +146,21 @@ void BenchApp::OnInitCmdLine(wxCmdLineParser& parser)
                          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);
@@ -146,8 +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;
@@ -183,13 +239,23 @@ int BenchApp::OnRun()
         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++ )
@@ -199,9 +265,6 @@ int BenchApp::OnRun()
 
             sw.Pause();
 
-            if ( !ok )
-                break;
-
             const long t = sw.Time();
             if ( t < timeMin )
                 timeMin = t;
@@ -210,6 +273,8 @@ int BenchApp::OnRun()
             timeTotal += t;
         }
 
+        func->Done();
+
         if ( !ok )
         {
             wxPrintf("ERROR\n");