VS 2015 std::char_traits<char16_t> операции
На моем рабочем месте мы изменили тип строки (который содержит интернационализированные символы) для std::wstring
в std::u16string
после VS 2015(обновление 3) обновление компилятора.
Из-за этого мы наблюдаем множество регрессий производительности, таких как этот.
Анализ профилировщика показывает, что std::u16string
"s std::char_traits<char16_t>
такие операции, как copy
, compare
, find
а также assign
являются наиболее пострадавшими и занимают больше времени, чем std::wstring
"s std::char_traits<wchar_t>
двойники.
Эти std::char_traits<wchar_t>
операции написаны с точки зрения std::wmem*
а также std::char_traits<char16_t>
операции написаны с точки зрения for loops
,
Если мы изменим эти черты операций для char16_t
тип (или 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)));
}
};
Это будет хорошо? Есть ли проблемы с этим подходом?