]> git.saurik.com Git - wxWidgets.git/blobdiff - tests/benchmarks/strings.cpp
need to AdjustScrollbars() after changing the virtual size in CalcDimensions()
[wxWidgets.git] / tests / benchmarks / strings.cpp
index e8506c91f97aba7c222aac146b5699db3f83e29a..f8219729a2ae920d27f3f289a56853ff8d1364a4 100644 (file)
@@ -9,8 +9,10 @@
 /////////////////////////////////////////////////////////////////////////////
 
 #include "wx/string.h"
 /////////////////////////////////////////////////////////////////////////////
 
 #include "wx/string.h"
+#include "wx/ffile.h"
 
 #include "bench.h"
 
 #include "bench.h"
+#include "htmlparser/htmlpars.h"
 
 static const char asciistr[] =
     "This is just the first line of a very long 7 bit ASCII string"
 
 static const char asciistr[] =
     "This is just the first line of a very long 7 bit ASCII string"
@@ -38,6 +40,23 @@ static const char utf8str[] =
     "\xD0\xA6\xD0\xB5\xD0\xBB\xD0\xBE\xD0\xB5 \xD1\x87\xD0\xB8\xD1\x81\xD0\xBB\xD0\xBE 9"
     ;
 
     "\xD0\xA6\xD0\xB5\xD0\xBB\xD0\xBE\xD0\xB5 \xD1\x87\xD0\xB8\xD1\x81\xD0\xBB\xD0\xBE 9"
     ;
 
+namespace
+{
+
+const wxString& GetTestAsciiString()
+{
+    static wxString testString;
+    if ( testString.empty() )
+    {
+        for ( long n = 0; n < Bench::GetNumericParameter(); n++ )
+            testString += wxString::FromAscii(asciistr);
+    }
+
+    return testString;
+}
+
+} // anonymous namespace
+
 // this is just a baseline
 BENCHMARK_FUNC(Strlen)
 {
 // this is just a baseline
 BENCHMARK_FUNC(Strlen)
 {
@@ -185,7 +204,7 @@ BENCHMARK_FUNC(ForCString)
 
 BENCHMARK_FUNC(ForStringIndex)
 {
 
 BENCHMARK_FUNC(ForStringIndex)
 {
-    const wxString s = wxString::FromAscii(utf8str);
+    const wxString& s = GetTestAsciiString();
     const size_t len = s.length();
     for ( size_t n = 0; n < len; n++ )
     {
     const size_t len = s.length();
     for ( size_t n = 0; n < len; n++ )
     {
@@ -198,7 +217,7 @@ BENCHMARK_FUNC(ForStringIndex)
 
 BENCHMARK_FUNC(ForStringIter)
 {
 
 BENCHMARK_FUNC(ForStringIter)
 {
-    const wxString s = wxString::FromAscii(utf8str);
+    const wxString& s = GetTestAsciiString();
     const wxString::const_iterator end = s.end();
     for ( wxString::const_iterator i = s.begin(); i != end; ++i )
     {
     const wxString::const_iterator end = s.end();
     for ( wxString::const_iterator i = s.begin(); i != end; ++i )
     {
@@ -211,7 +230,7 @@ BENCHMARK_FUNC(ForStringIter)
 
 BENCHMARK_FUNC(ForStringRIter)
 {
 
 BENCHMARK_FUNC(ForStringRIter)
 {
-    const wxString s = wxString::FromAscii(utf8str);
+    const wxString& s = GetTestAsciiString();
     const wxString::const_reverse_iterator rend = s.rend();
     for ( wxString::const_reverse_iterator i = s.rbegin(); i != rend; ++i )
     {
     const wxString::const_reverse_iterator rend = s.rend();
     for ( wxString::const_reverse_iterator i = s.rbegin(); i != rend; ++i )
     {
@@ -226,12 +245,12 @@ BENCHMARK_FUNC(ForStringRIter)
 // wxString::Replace()
 // ----------------------------------------------------------------------------
 
 // wxString::Replace()
 // ----------------------------------------------------------------------------
 
-const size_t REPLACE_STR_LEN = strlen(asciistr);
+const size_t ASCIISTR_LEN = strlen(asciistr);
 
 BENCHMARK_FUNC(ReplaceLoop)
 {
 
 BENCHMARK_FUNC(ReplaceLoop)
 {
-    wxString str('x', REPLACE_STR_LEN);
-    for ( size_t n = 0; n < REPLACE_STR_LEN; n++ )
+    wxString str('x', ASCIISTR_LEN);
+    for ( size_t n = 0; n < ASCIISTR_LEN; n++ )
     {
         if ( str[n] == 'a' )
             str[n] = 'z';
     {
         if ( str[n] == 'a' )
             str[n] = 'z';
@@ -242,7 +261,7 @@ BENCHMARK_FUNC(ReplaceLoop)
 
 BENCHMARK_FUNC(ReplaceNone)
 {
 
 BENCHMARK_FUNC(ReplaceNone)
 {
-    wxString str('x', REPLACE_STR_LEN);
+    wxString str('x', ASCIISTR_LEN);
     return str.Replace("a", "z") == 0;
 }
 
     return str.Replace("a", "z") == 0;
 }
 
@@ -254,7 +273,56 @@ BENCHMARK_FUNC(ReplaceSome)
 
 BENCHMARK_FUNC(ReplaceAll)
 {
 
 BENCHMARK_FUNC(ReplaceAll)
 {
-    wxString str('x', REPLACE_STR_LEN);
+    wxString str('x', ASCIISTR_LEN);
     return str.Replace("x", "y") != 0;
 }
 
     return str.Replace("x", "y") != 0;
 }
 
+
+// ----------------------------------------------------------------------------
+// string buffers: wx[W]CharBuffer
+// ----------------------------------------------------------------------------
+
+BENCHMARK_FUNC(CharBuffer)
+{
+    wxString str(asciistr);
+
+    // NB: wxStrlen() is here to simulate some use of the returned buffer.
+    //     Both mb_str() and wc_str() are used so that this code does something
+    //     nontrivial in any build.
+    return wxStrlen(str.mb_str()) == ASCIISTR_LEN &&
+           wxStrlen(str.wc_str()) == ASCIISTR_LEN;
+}
+
+
+// ----------------------------------------------------------------------------
+// wxString::operator[] - parse large HTML page
+// ----------------------------------------------------------------------------
+
+class DummyParser : public wx28HtmlParser
+{
+public:
+    virtual wxObject* GetProduct() { return NULL; }
+    virtual void AddText(const wxChar*) {}
+};
+
+
+BENCHMARK_FUNC(ParseHTML)
+{
+    // static so that construction time is not counted
+    static DummyParser parser;
+    static wxString html;
+    if ( html.empty() )
+    {
+        wxString html1;
+        wxFFile("htmltest.html").ReadAll(&html1, wxConvUTF8);
+
+        // this is going to make for some invalid HTML, of course, but it
+        // doesn't really matter
+        for ( long n = 0; n < Bench::GetNumericParameter(); n++ )
+            html += html1;
+    }
+
+    parser.Parse(html);
+
+    return true;
+}