add benchmark of utf 32->8 encoding speed
This commit is contained in:
parent
147a289936
commit
c489549b56
1 changed files with 100 additions and 0 deletions
100
benchmark/test_utf_encoding.cpp
Normal file
100
benchmark/test_utf_encoding.cpp
Normal file
|
@ -0,0 +1,100 @@
|
|||
#include "bench_framework.hpp"
|
||||
#include <mapnik/unicode.hpp>
|
||||
#include <mapnik/value.hpp>
|
||||
#include <codecvt>
|
||||
#include <boost/locale.hpp>
|
||||
|
||||
class test : public benchmark::test_case
|
||||
{
|
||||
std::string utf8_;
|
||||
public:
|
||||
test(mapnik::parameters const& params)
|
||||
: test_case(params),
|
||||
utf8_(u8"שלום") {}
|
||||
bool validate() const
|
||||
{
|
||||
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> utf32conv;
|
||||
std::u32string utf32 = utf32conv.from_bytes(utf8_);
|
||||
if (utf32.size() != 4) return false;
|
||||
if (utf32[0] != 0x5e9 &&
|
||||
utf32[1] != 0x5dc &&
|
||||
utf32[2] != 0x5d5 &&
|
||||
utf32[3] != 0x5dd) return false;
|
||||
return true;
|
||||
}
|
||||
void operator()() const
|
||||
{
|
||||
std::u32string utf32;
|
||||
std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> utf32conv;
|
||||
for (std::size_t i=0;i<iterations_;++i) {
|
||||
utf32 = utf32conv.from_bytes(utf8_);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class test2 : public benchmark::test_case
|
||||
{
|
||||
std::string utf8_;
|
||||
public:
|
||||
test2(mapnik::parameters const& params)
|
||||
: test_case(params),
|
||||
utf8_(u8"שלום") {}
|
||||
bool validate() const
|
||||
{
|
||||
std::u32string utf32 = boost::locale::conv::utf_to_utf<char32_t>(utf8_);
|
||||
if (utf32.size() != 4) return false;
|
||||
if (utf32[0] != 0x5e9 &&
|
||||
utf32[1] != 0x5dc &&
|
||||
utf32[2] != 0x5d5 &&
|
||||
utf32[3] != 0x5dd) return false;
|
||||
return true;
|
||||
}
|
||||
void operator()() const
|
||||
{
|
||||
std::u32string utf32;
|
||||
for (std::size_t i=0;i<iterations_;++i) {
|
||||
utf32 = boost::locale::conv::utf_to_utf<char32_t>(utf8_);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
class test3 : public benchmark::test_case
|
||||
{
|
||||
std::string utf8_;
|
||||
public:
|
||||
test3(mapnik::parameters const& params)
|
||||
: test_case(params),
|
||||
utf8_(u8"שלום") {}
|
||||
bool validate() const
|
||||
{
|
||||
mapnik::transcoder tr_("utf-8");
|
||||
mapnik::value_unicode_string utf32 = tr_.transcode(utf8_.data(),utf8_.size());
|
||||
//std::u32string utf32 = boost::locale::conv::utf_to_utf<char32_t>(utf8_);
|
||||
if (utf32.length() != 4) return false;
|
||||
if (utf32[0] != 0x5e9 &&
|
||||
utf32[1] != 0x5dc &&
|
||||
utf32[2] != 0x5d5 &&
|
||||
utf32[3] != 0x5dd) return false;
|
||||
return true;
|
||||
}
|
||||
void operator()() const
|
||||
{
|
||||
mapnik::transcoder tr_("utf-8");
|
||||
mapnik::value_unicode_string utf32;
|
||||
for (std::size_t i=0;i<iterations_;++i) {
|
||||
utf32 = tr_.transcode(utf8_.data(),utf8_.size());
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
int main(int argc, char** argv)
|
||||
{
|
||||
mapnik::parameters params;
|
||||
benchmark::handle_args(argc,argv,params);
|
||||
test test_runner(params);
|
||||
run(test_runner,"utf encode std::codecvt");
|
||||
test2 test_runner2(params);
|
||||
run(test_runner2,"utf encode boost::locale");
|
||||
test3 test_runner3(params);
|
||||
return run(test_runner3,"utf encode ICU");
|
||||
}
|
Loading…
Reference in a new issue