1

在我的工作场所,我们在 VS 2015(更新 3)编译器升级后将std::wstring字符串类型(包含国际化字符)更改为 from 。std::u16string

由于这个原因,我们看到了大量的性能回归,例如this

分析器分析表明std::u16stringstd::char_traits<char16_t>操作,如copy、和是最受打击的compare,并且比' 的对应操作花费的时间更长。findassignstd::wstringstd::char_traits<wchar_t>

这些std::char_traits<wchar_t>操作是用 来编写的,std::wmem*std::char_traits<char16_t>操作是用 来编写的for loops

如果我们将char16_ttype (or std::u16string) 的这些特征操作更改为使用我们自己定制的特征,我们会看到性能改进,性能与std::wstring.

我们计划编写我们自己的自定义特征(直到 MS 为下一个版本的 VS 修复它)如下

struct string_custom_traits : public std::char_traits<char16_t>
{
    static const char16_t * copy(char16_t* dest, const char16_t* src, size_t count)
    {
        return (count == 0 ? src : (char16_t*)std::memcpy(dest, src, count * sizeof(char16_t)));
    }               
};

这样可以吗?这种方法有什么问题吗?

4

0 回答 0