diff --git a/tests/benchmarks/Makefile.in b/tests/benchmarks/Makefile.in
index 98b51ded8b..40cc91cb95 100644
--- a/tests/benchmarks/Makefile.in
+++ b/tests/benchmarks/Makefile.in
@@ -47,6 +47,7 @@ BENCH_OBJECTS = \
bench_htmlpars.o \
bench_htmltag.o \
bench_ipcclient.o \
+ bench_mbconv.o \
bench_strings.o \
bench_tls.o
@@ -136,6 +137,9 @@ bench_htmltag.o: $(srcdir)/htmlparser/htmltag.cpp
bench_ipcclient.o: $(srcdir)/ipcclient.cpp
$(CXXC) -c -o $@ $(BENCH_CXXFLAGS) $(srcdir)/ipcclient.cpp
+bench_mbconv.o: $(srcdir)/mbconv.cpp
+ $(CXXC) -c -o $@ $(BENCH_CXXFLAGS) $(srcdir)/mbconv.cpp
+
bench_strings.o: $(srcdir)/strings.cpp
$(CXXC) -c -o $@ $(BENCH_CXXFLAGS) $(srcdir)/strings.cpp
diff --git a/tests/benchmarks/bench.bkl b/tests/benchmarks/bench.bkl
index d24d9fb401..819ab0bd41 100644
--- a/tests/benchmarks/bench.bkl
+++ b/tests/benchmarks/bench.bkl
@@ -14,6 +14,7 @@
htmlparser/htmlpars.cpp
htmlparser/htmltag.cpp
ipcclient.cpp
+ mbconv.cpp
strings.cpp
tls.cpp
diff --git a/tests/benchmarks/bench.dsp b/tests/benchmarks/bench.dsp
index 193aa2597e..2789d23d17 100644
--- a/tests/benchmarks/bench.dsp
+++ b/tests/benchmarks/bench.dsp
@@ -251,6 +251,10 @@ SOURCE=.\ipcclient.cpp
# End Source File
# Begin Source File
+SOURCE=.\mbconv.cpp
+# End Source File
+# Begin Source File
+
SOURCE=.\strings.cpp
# End Source File
# Begin Source File
diff --git a/tests/benchmarks/bench.vcproj b/tests/benchmarks/bench.vcproj
index 4abc057ec9..bc97321870 100644
--- a/tests/benchmarks/bench.vcproj
+++ b/tests/benchmarks/bench.vcproj
@@ -537,6 +537,9 @@
+
+
diff --git a/tests/benchmarks/makefile.bcc b/tests/benchmarks/makefile.bcc
index 8328ca9ccb..855190d6ff 100644
--- a/tests/benchmarks/makefile.bcc
+++ b/tests/benchmarks/makefile.bcc
@@ -39,6 +39,7 @@ BENCH_OBJECTS = \
$(OBJS)\bench_htmlpars.obj \
$(OBJS)\bench_htmltag.obj \
$(OBJS)\bench_ipcclient.obj \
+ $(OBJS)\bench_mbconv.obj \
$(OBJS)\bench_strings.obj \
$(OBJS)\bench_tls.obj
@@ -212,6 +213,9 @@ $(OBJS)\bench_htmltag.obj: .\htmlparser\htmltag.cpp
$(OBJS)\bench_ipcclient.obj: .\ipcclient.cpp
$(CXX) -q -c -P -o$@ $(BENCH_CXXFLAGS) .\ipcclient.cpp
+$(OBJS)\bench_mbconv.obj: .\mbconv.cpp
+ $(CXX) -q -c -P -o$@ $(BENCH_CXXFLAGS) .\mbconv.cpp
+
$(OBJS)\bench_strings.obj: .\strings.cpp
$(CXX) -q -c -P -o$@ $(BENCH_CXXFLAGS) .\strings.cpp
diff --git a/tests/benchmarks/makefile.gcc b/tests/benchmarks/makefile.gcc
index c8c7b7f1d7..91f3c43b6c 100644
--- a/tests/benchmarks/makefile.gcc
+++ b/tests/benchmarks/makefile.gcc
@@ -32,6 +32,7 @@ BENCH_OBJECTS = \
$(OBJS)\bench_htmlpars.o \
$(OBJS)\bench_htmltag.o \
$(OBJS)\bench_ipcclient.o \
+ $(OBJS)\bench_mbconv.o \
$(OBJS)\bench_strings.o \
$(OBJS)\bench_tls.o
@@ -202,6 +203,9 @@ $(OBJS)\bench_htmltag.o: ./htmlparser/htmltag.cpp
$(OBJS)\bench_ipcclient.o: ./ipcclient.cpp
$(CXX) -c -o $@ $(BENCH_CXXFLAGS) $(CPPDEPS) $<
+$(OBJS)\bench_mbconv.o: ./mbconv.cpp
+ $(CXX) -c -o $@ $(BENCH_CXXFLAGS) $(CPPDEPS) $<
+
$(OBJS)\bench_strings.o: ./strings.cpp
$(CXX) -c -o $@ $(BENCH_CXXFLAGS) $(CPPDEPS) $<
diff --git a/tests/benchmarks/makefile.vc b/tests/benchmarks/makefile.vc
index fb7cb3e559..13fcddd7a0 100644
--- a/tests/benchmarks/makefile.vc
+++ b/tests/benchmarks/makefile.vc
@@ -33,6 +33,7 @@ BENCH_OBJECTS = \
$(OBJS)\bench_htmlpars.obj \
$(OBJS)\bench_htmltag.obj \
$(OBJS)\bench_ipcclient.obj \
+ $(OBJS)\bench_mbconv.obj \
$(OBJS)\bench_strings.obj \
$(OBJS)\bench_tls.obj
@@ -269,6 +270,9 @@ $(OBJS)\bench_htmltag.obj: .\htmlparser\htmltag.cpp
$(OBJS)\bench_ipcclient.obj: .\ipcclient.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BENCH_CXXFLAGS) .\ipcclient.cpp
+$(OBJS)\bench_mbconv.obj: .\mbconv.cpp
+ $(CXX) /c /nologo /TP /Fo$@ $(BENCH_CXXFLAGS) .\mbconv.cpp
+
$(OBJS)\bench_strings.obj: .\strings.cpp
$(CXX) /c /nologo /TP /Fo$@ $(BENCH_CXXFLAGS) .\strings.cpp
diff --git a/tests/benchmarks/makefile.wat b/tests/benchmarks/makefile.wat
index 3e3b9b01d4..b14102eb7e 100644
--- a/tests/benchmarks/makefile.wat
+++ b/tests/benchmarks/makefile.wat
@@ -218,6 +218,7 @@ BENCH_OBJECTS = &
$(OBJS)\bench_htmlpars.obj &
$(OBJS)\bench_htmltag.obj &
$(OBJS)\bench_ipcclient.obj &
+ $(OBJS)\bench_mbconv.obj &
$(OBJS)\bench_strings.obj &
$(OBJS)\bench_tls.obj
@@ -266,6 +267,9 @@ $(OBJS)\bench_htmltag.obj : .AUTODEPEND .\htmlparser\htmltag.cpp
$(OBJS)\bench_ipcclient.obj : .AUTODEPEND .\ipcclient.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(BENCH_CXXFLAGS) $<
+$(OBJS)\bench_mbconv.obj : .AUTODEPEND .\mbconv.cpp
+ $(CXX) -bt=nt -zq -fo=$^@ $(BENCH_CXXFLAGS) $<
+
$(OBJS)\bench_strings.obj : .AUTODEPEND .\strings.cpp
$(CXX) -bt=nt -zq -fo=$^@ $(BENCH_CXXFLAGS) $<
diff --git a/tests/benchmarks/mbconv.cpp b/tests/benchmarks/mbconv.cpp
new file mode 100644
index 0000000000..a3e51305d6
--- /dev/null
+++ b/tests/benchmarks/mbconv.cpp
@@ -0,0 +1,79 @@
+/////////////////////////////////////////////////////////////////////////////
+// Name: tests/benchmarks/mbconv.cpp
+// Purpose: MB<->WC conversion benchmarks
+// Author: Vadim Zeitlin
+// Created: 2008-10-17
+// RCS-ID: $Id$
+// Copyright: (c) 2008 Vadim Zeitlin
+// Licence: wxWindows license
+/////////////////////////////////////////////////////////////////////////////
+
+#include "wx/strconv.h"
+#include "wx/string.h"
+
+#include "bench.h"
+
+namespace
+{
+
+const wchar_t *TEST_STRING =
+ L"Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod"
+ L"tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim"
+ L"veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea"
+ L"commodo consequat. Duis aute irure dolor in reprehenderit in voluptate"
+ L"velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint"
+ L"occaecat cupidatat non proident, sunt in culpa qui officia deserunt"
+ L"mollit anim id est laborum."
+ ;
+
+// just compute the length of the resulting multibyte string
+bool ComputeMBLength(const wxMBConv& conv)
+{
+ // we suppose a fixed length encoding here (which happens to cover UTF-8
+ // too as long as the test string is ASCII)
+ return conv.FromWChar(NULL, 0, TEST_STRING)
+ == (wcslen(TEST_STRING) + 1)*conv.GetMBNulLen();
+}
+
+// perform the conversion
+bool ConvertToMB(const wxMBConv& conv)
+{
+ const size_t outlen = (wcslen(TEST_STRING) + 1)*conv.GetMBNulLen();
+ wxCharBuffer buf(outlen - 1); // it adds 1 internally
+ return conv.FromWChar(buf.data(), outlen, TEST_STRING) == outlen;
+}
+
+} // anonymous namespace
+
+BENCHMARK_FUNC(UTF16InitWX)
+{
+ wxMBConvUTF16 conv;
+ return true;
+}
+
+BENCHMARK_FUNC(UTF16InitSys)
+{
+ wxCSConv conv("UTF-16LE");
+ return conv.IsOk();
+}
+
+BENCHMARK_FUNC(UTF16LenWX)
+{
+ return ComputeMBLength(wxMBConvUTF16());
+}
+
+BENCHMARK_FUNC(UTF16LenSys)
+{
+ return ComputeMBLength(wxCSConv("UTF-16LE"));
+}
+
+BENCHMARK_FUNC(UTF16WX)
+{
+ return ConvertToMB(wxMBConvUTF16());
+}
+
+BENCHMARK_FUNC(UTF16Sys)
+{
+ return ConvertToMB(wxCSConv("UTF-16LE"));
+}
+