]> git.saurik.com Git - wxWidgets.git/blobdiff - tests/benchmarks/strings.cpp
Ensure that detached menus don't keep focus grab in wxGTK.
[wxWidgets.git] / tests / benchmarks / strings.cpp
index 23a181d8c38b9fbaa47becc93dfd882bfcfd6e1f..6ea1f53e8608bc120fe28d44132a41b89053e909 100644 (file)
@@ -5,7 +5,7 @@
 // Created:     2008-07-19
 // RCS-ID:      $Id$
 // Copyright:   (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>
-// Licence:     wxWindows license
+// Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
 #include "wx/string.h"
@@ -40,6 +40,27 @@ 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"
     ;
 
+namespace
+{
+
+const wxString& GetTestAsciiString()
+{
+    static wxString testString;
+    if ( testString.empty() )
+    {
+        long num = Bench::GetNumericParameter();
+        if ( !num )
+            num = 1;
+
+        for ( long n = 0; n < num; n++ )
+            testString += wxString::FromAscii(asciistr);
+    }
+
+    return testString;
+}
+
+} // anonymous namespace
+
 // this is just a baseline
 BENCHMARK_FUNC(Strlen)
 {
@@ -187,7 +208,7 @@ BENCHMARK_FUNC(ForCString)
 
 BENCHMARK_FUNC(ForStringIndex)
 {
-    const wxString s = wxString::FromAscii(asciistr);
+    const wxString& s = GetTestAsciiString();
     const size_t len = s.length();
     for ( size_t n = 0; n < len; n++ )
     {
@@ -200,7 +221,7 @@ BENCHMARK_FUNC(ForStringIndex)
 
 BENCHMARK_FUNC(ForStringIter)
 {
-    const wxString s = wxString::FromAscii(asciistr);
+    const wxString& s = GetTestAsciiString();
     const wxString::const_iterator end = s.end();
     for ( wxString::const_iterator i = s.begin(); i != end; ++i )
     {
@@ -213,7 +234,7 @@ BENCHMARK_FUNC(ForStringIter)
 
 BENCHMARK_FUNC(ForStringRIter)
 {
-    const wxString s = wxString::FromAscii(asciistr);
+    const wxString& s = GetTestAsciiString();
     const wxString::const_reverse_iterator rend = s.rend();
     for ( wxString::const_reverse_iterator i = s.rbegin(); i != rend; ++i )
     {
@@ -260,6 +281,126 @@ BENCHMARK_FUNC(ReplaceAll)
     return str.Replace("x", "y") != 0;
 }
 
+BENCHMARK_FUNC(ReplaceLonger)
+{
+    wxString str('x', ASCIISTR_LEN);
+    return str.Replace("x", "yy") != 0;
+}
+
+BENCHMARK_FUNC(ReplaceShorter)
+{
+    wxString str('x', ASCIISTR_LEN);
+    return str.Replace("xx", "y") != 0;
+}
+
+// ----------------------------------------------------------------------------
+// string case conversion
+// ----------------------------------------------------------------------------
+
+BENCHMARK_FUNC(Lower)
+{
+    return GetTestAsciiString().Lower().length() > 0;
+}
+
+BENCHMARK_FUNC(Upper)
+{
+    return GetTestAsciiString().Upper().length() > 0;
+}
+
+// ----------------------------------------------------------------------------
+// string comparison
+// ----------------------------------------------------------------------------
+
+BENCHMARK_FUNC(StrcmpA)
+{
+    const wxString& s = GetTestAsciiString();
+
+    return wxCRT_StrcmpA(s.c_str(), s.c_str()) == 0;
+}
+
+BENCHMARK_FUNC(StrcmpW)
+{
+    const wxString& s = GetTestAsciiString();
+
+    return wxCRT_StrcmpW(s.wc_str(), s.wc_str()) == 0;
+}
+
+BENCHMARK_FUNC(StricmpA)
+{
+    const wxString& s = GetTestAsciiString();
+
+    return wxCRT_StricmpA(s.c_str(), s.c_str()) == 0;
+}
+
+BENCHMARK_FUNC(StricmpW)
+{
+    const wxString& s = GetTestAsciiString();
+
+    return wxCRT_StricmpW(s.wc_str(), s.wc_str()) == 0;
+}
+
+BENCHMARK_FUNC(StringCmp)
+{
+    const wxString& s = GetTestAsciiString();
+
+    return s.Cmp(s) == 0;
+}
+
+BENCHMARK_FUNC(StringCmpNoCase)
+{
+    const wxString& s = GetTestAsciiString();
+
+    return s.CmpNoCase(s) == 0;
+}
+
+// Also benchmark various native functions under MSW. Surprisingly/annoyingly
+// they sometimes have vastly better performance than alternatives, especially
+// for case-sensitive comparison (see #10375).
+#ifdef __WINDOWS__
+
+#include "wx/msw/wrapwin.h"
+
+BENCHMARK_FUNC(MSWlstrcmp)
+{
+    const wxString& s = GetTestAsciiString();
+
+    return lstrcmp(s.t_str(), s.t_str()) == 0;
+}
+
+BENCHMARK_FUNC(MSWlstrcmpi)
+{
+    const wxString& s = GetTestAsciiString();
+
+    return lstrcmpi(s.t_str(), s.t_str()) == 0;
+}
+
+BENCHMARK_FUNC(MSWCompareString)
+{
+    const wxString& s = GetTestAsciiString();
+
+    return ::CompareString
+             (
+                LOCALE_USER_DEFAULT,
+                0,
+                s.t_str(), s.length(),
+                s.t_str(), s.length()
+             ) == CSTR_EQUAL;
+}
+
+BENCHMARK_FUNC(MSWCompareStringIgnoreCase)
+{
+    const wxString& s = GetTestAsciiString();
+
+    return ::CompareString
+             (
+                LOCALE_USER_DEFAULT,
+                NORM_IGNORECASE,
+                s.t_str(), s.length(),
+                s.t_str(), s.length()
+             ) == CSTR_EQUAL;
+}
+
+#endif // __WINDOWS__
 
 // ----------------------------------------------------------------------------
 // string buffers: wx[W]CharBuffer
@@ -301,7 +442,11 @@ BENCHMARK_FUNC(ParseHTML)
 
         // 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++ )
+        long num = Bench::GetNumericParameter();
+        if ( !num )
+            num = 1;
+
+        for ( long n = 0; n < num; n++ )
             html += html1;
     }