pass asciistr, not utf8str, to FromAscii
[wxWidgets.git] / tests / benchmarks / strings.cpp
1 /////////////////////////////////////////////////////////////////////////////
2 // Name: tests/benchmarks/strings.cpp
3 // Purpose: String-related benchmarks
4 // Author: Vadim Zeitlin
5 // Created: 2008-07-19
6 // RCS-ID: $Id$
7 // Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>
8 // Licence: wxWindows license
9 /////////////////////////////////////////////////////////////////////////////
10
11 #include "wx/string.h"
12
13 #include "bench.h"
14
15 static const char asciistr[] =
16 "This is just the first line of a very long 7 bit ASCII string"
17 "This is just the second line of a very long 7 bit ASCII string"
18 "This is just the third line of a very long 7 bit ASCII string"
19 "This is just the fourth line of a very long 7 bit ASCII string"
20 "This is just the fifth line of a very long 7 bit ASCII string"
21 "This is just the sixth line of a very long 7 bit ASCII string"
22 "This is just the seventh line of a very long 7 bit ASCII string"
23 "This is just the eighth line of a very long 7 bit ASCII string"
24 "This is just the ninth line of a very long 7 bit ASCII string"
25 "This is just the tenth line of a very long 7 bit ASCII string"
26 ;
27
28 static const char utf8str[] =
29 "\xD0\xA6\xD0\xB5\xD0\xBB\xD0\xBE\xD0\xB5 \xD1\x87\xD0\xB8\xD1\x81\xD0\xBB\xD0\xBE 0"
30 "\xD0\xA6\xD0\xB5\xD0\xBB\xD0\xBE\xD0\xB5 \xD1\x87\xD0\xB8\xD1\x81\xD0\xBB\xD0\xBE 1"
31 "\xD0\xA6\xD0\xB5\xD0\xBB\xD0\xBE\xD0\xB5 \xD1\x87\xD0\xB8\xD1\x81\xD0\xBB\xD0\xBE 2"
32 "\xD0\xA6\xD0\xB5\xD0\xBB\xD0\xBE\xD0\xB5 \xD1\x87\xD0\xB8\xD1\x81\xD0\xBB\xD0\xBE 3"
33 "\xD0\xA6\xD0\xB5\xD0\xBB\xD0\xBE\xD0\xB5 \xD1\x87\xD0\xB8\xD1\x81\xD0\xBB\xD0\xBE 4"
34 "\xD0\xA6\xD0\xB5\xD0\xBB\xD0\xBE\xD0\xB5 \xD1\x87\xD0\xB8\xD1\x81\xD0\xBB\xD0\xBE 5"
35 "\xD0\xA6\xD0\xB5\xD0\xBB\xD0\xBE\xD0\xB5 \xD1\x87\xD0\xB8\xD1\x81\xD0\xBB\xD0\xBE 6"
36 "\xD0\xA6\xD0\xB5\xD0\xBB\xD0\xBE\xD0\xB5 \xD1\x87\xD0\xB8\xD1\x81\xD0\xBB\xD0\xBE 7"
37 "\xD0\xA6\xD0\xB5\xD0\xBB\xD0\xBE\xD0\xB5 \xD1\x87\xD0\xB8\xD1\x81\xD0\xBB\xD0\xBE 8"
38 "\xD0\xA6\xD0\xB5\xD0\xBB\xD0\xBE\xD0\xB5 \xD1\x87\xD0\xB8\xD1\x81\xD0\xBB\xD0\xBE 9"
39 ;
40
41 // this is just a baseline
42 BENCHMARK_FUNC(Strlen)
43 {
44 if ( strlen(utf8str) != WXSIZEOF(utf8str) - 1 )
45 return false;
46
47 if ( strlen(asciistr) != WXSIZEOF(asciistr) - 1 )
48 return false;
49
50 return true;
51 }
52
53 // ----------------------------------------------------------------------------
54 // FromUTF8() benchmarks
55 // ----------------------------------------------------------------------------
56
57 BENCHMARK_FUNC(FromUTF8)
58 {
59 wxString s = wxString::FromUTF8(utf8str);
60 if ( s.empty() )
61 return false;
62
63 s = wxString::FromUTF8(asciistr);
64 if ( s.empty() )
65 return false;
66
67 return true;
68 }
69
70 BENCHMARK_FUNC(FromUTF8WithNpos)
71 {
72 wxString s = wxString::FromUTF8(utf8str, wxString::npos);
73 if ( s.empty() )
74 return false;
75
76 s = wxString::FromUTF8(asciistr, wxString::npos);
77 if ( s.empty() )
78 return false;
79
80 return true;
81 }
82
83 BENCHMARK_FUNC(FromUTF8WithLen)
84 {
85 wxString s = wxString::FromUTF8(utf8str, WXSIZEOF(utf8str));
86 if ( s.empty() )
87 return false;
88
89 s = wxString::FromUTF8(asciistr, WXSIZEOF(asciistr));
90 if ( s.empty() )
91 return false;
92
93 return true;
94 }
95
96 // ----------------------------------------------------------------------------
97 // FromUTF8Unchecked() benchmarks
98 // ----------------------------------------------------------------------------
99
100 BENCHMARK_FUNC(FromUTF8Unchecked)
101 {
102 wxString s = wxString::FromUTF8Unchecked(utf8str);
103 if ( s.empty() )
104 return false;
105
106 s = wxString::FromUTF8Unchecked(asciistr);
107 if ( s.empty() )
108 return false;
109
110 return true;
111 }
112
113 BENCHMARK_FUNC(FromUTF8UncheckedWithNpos)
114 {
115 wxString s = wxString::FromUTF8Unchecked(utf8str, wxString::npos);
116 if ( s.empty() )
117 return false;
118
119 s = wxString::FromUTF8Unchecked(asciistr, wxString::npos);
120 if ( s.empty() )
121 return false;
122
123 return true;
124 }
125
126 BENCHMARK_FUNC(FromUTF8UncheckedWithLen)
127 {
128 wxString s = wxString::FromUTF8Unchecked(utf8str, WXSIZEOF(utf8str));
129 if ( s.empty() )
130 return false;
131
132 s = wxString::FromUTF8Unchecked(asciistr, WXSIZEOF(asciistr));
133 if ( s.empty() )
134 return false;
135
136 return true;
137 }
138
139 // ----------------------------------------------------------------------------
140 // FromAscii() benchmarks
141 // ----------------------------------------------------------------------------
142
143 BENCHMARK_FUNC(FromAscii)
144 {
145 wxString s = wxString::FromAscii(asciistr);
146 if ( s.empty() )
147 return false;
148
149 return true;
150 }
151
152 BENCHMARK_FUNC(FromAsciiWithNpos)
153 {
154 wxString s = wxString::FromAscii(asciistr);
155 if ( s.empty() )
156 return false;
157
158 return true;
159 }
160
161 BENCHMARK_FUNC(FromAsciiWithLen)
162 {
163 wxString s = wxString::FromAscii(asciistr, WXSIZEOF(asciistr));
164 if ( s.empty() )
165 return false;
166
167 return true;
168 }
169
170 // ----------------------------------------------------------------------------
171 // simple string iteration
172 // ----------------------------------------------------------------------------
173
174 // baseline
175 BENCHMARK_FUNC(ForCString)
176 {
177 for ( size_t n = 0; n < WXSIZEOF(asciistr); n++ )
178 {
179 if ( asciistr[n] == '~' )
180 return false;
181 }
182
183 return true;
184 }
185
186 BENCHMARK_FUNC(ForStringIndex)
187 {
188 const wxString s = wxString::FromAscii(asciistr);
189 const size_t len = s.length();
190 for ( size_t n = 0; n < len; n++ )
191 {
192 if ( s[n] == '~' )
193 return false;
194 }
195
196 return true;
197 }
198
199 BENCHMARK_FUNC(ForStringIter)
200 {
201 const wxString s = wxString::FromAscii(asciistr);
202 const wxString::const_iterator end = s.end();
203 for ( wxString::const_iterator i = s.begin(); i != end; ++i )
204 {
205 if ( *i == '~' )
206 return false;
207 }
208
209 return true;
210 }
211
212 BENCHMARK_FUNC(ForStringRIter)
213 {
214 const wxString s = wxString::FromAscii(asciistr);
215 const wxString::const_reverse_iterator rend = s.rend();
216 for ( wxString::const_reverse_iterator i = s.rbegin(); i != rend; ++i )
217 {
218 if ( *i == '~' )
219 return false;
220 }
221
222 return true;
223 }
224
225 // ----------------------------------------------------------------------------
226 // wxString::Replace()
227 // ----------------------------------------------------------------------------
228
229 const size_t REPLACE_STR_LEN = strlen(asciistr);
230
231 BENCHMARK_FUNC(ReplaceLoop)
232 {
233 wxString str('x', REPLACE_STR_LEN);
234 for ( size_t n = 0; n < REPLACE_STR_LEN; n++ )
235 {
236 if ( str[n] == 'a' )
237 str[n] = 'z';
238 }
239
240 return str.length() != 0;
241 }
242
243 BENCHMARK_FUNC(ReplaceNone)
244 {
245 wxString str('x', REPLACE_STR_LEN);
246 return str.Replace("a", "z") == 0;
247 }
248
249 BENCHMARK_FUNC(ReplaceSome)
250 {
251 wxString str(asciistr);
252 return str.Replace("7", "8") != 0;
253 }
254
255 BENCHMARK_FUNC(ReplaceAll)
256 {
257 wxString str('x', REPLACE_STR_LEN);
258 return str.Replace("x", "y") != 0;
259 }
260