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)));
    }               
};

Это будет хорошо? Есть ли проблемы с этим подходом?

0 ответов

Другие вопросы по тегам