Size: a a a

Compiler Development

2020 December 01

А⚙

Антон ⚙️ in Compiler Development
MaxGraey
Еще раз вычислить длину для UTF-8 это O(N) задача, если она не закеширована, а если стоки мутабельны то это практически всегда и гарантированно придется делать. Что бы достать n-й символ из UTF-8 нужно его декодировать - это довольно недешевая операция. Для UCS-2 это O(1) и никакой амортизации при доставании символа соответственно)
А теперь скажи мне, зачем тебе нужен произвольный доступ по индексу
источник

M

MaxGraey in Compiler Development
Антон ⚙️
А теперь скажи мне, зачем тебе нужен произвольный доступ по индексу
Еще раз, проблема не только в произвольном доступе, он может быть и не нужен в 99%. Проблема в том, что когда ты сканируешь строку или тебе нужно ее разбить на code points с UTF8 ты делаешь каждый раз декодирование. Примерно вот такое:
https://bjoern.hoehrmann.de/utf-8/decoder/dfa

Там еще быстрыее реализации приведены. А для UCS-2 ты просто считываешь 2 байта из массива. Все)
источник

M

MaxGraey in Compiler Development
Еще ты можешь так же их сравнивать, так же как сравниваешь два куска памяти) А вот для сравнения 2-х utf8 строк придется их посимвольно деклдировать и сравнить codepoints
источник

А⚙

Антон ⚙️ in Compiler Development
MaxGraey
Еще раз, проблема не только в произвольном доступе, он может быть и не нужен в 99%. Проблема в том, что когда ты сканируешь строку или тебе нужно ее разбить на code points с UTF8 ты делаешь каждый раз декодирование. Примерно вот такое:
https://bjoern.hoehrmann.de/utf-8/decoder/dfa

Там еще быстрыее реализации приведены. А для UCS-2 ты просто считываешь 2 байта из массива. Все)
И зачем тебе нужно на code point-ы разбивать?
источник

А⚙

Антон ⚙️ in Compiler Development
MaxGraey
Еще ты можешь так же их сравнивать, так же как сравниваешь два куска памяти) А вот для сравнения 2-х utf8 строк придется их посимвольно деклдировать и сравнить codepoints
Лол, а вот это просто неправда
источник

M

MaxGraey in Compiler Development
Разница на самом деле коллосальная, так как тот же memcmp хорошо оптимизирован и векторизирован
источник

А⚙

Антон ⚙️ in Compiler Development
MaxGraey
Разница на самом деле коллосальная, так как тот же memcmp хорошо оптимизирован и векторизирован
Строки в UTF-8 можно сравнивать memcmp
источник

E

EgorBo in Compiler Development
Антон ⚙️
Строки в UTF-8 можно сравнивать memcmp
только если ты сперва проведешь анализ что там все символы ASCII
источник

E

EgorBo in Compiler Development
но его можно векторизовать тоже
источник

E

EgorBo in Compiler Development
но не имеет смысла тогда memcmp
источник

M

MaxGraey in Compiler Development
Антон ⚙️
Строки в UTF-8 можно сравнивать memcmp
К сожалению вы плохо знакомы с темой. Это не так, даже UTF16 нельзя сравнивать чкркз memcmp (во всяком случае полностью)
источник

E

EgorBo in Compiler Development
лучше за 1 проход и то и другое сделать
источник

M

MaxGraey in Compiler Development
EgorBo
только если ты сперва проведешь анализ что там все символы ASCII
Это уже частный случай
источник

E

EgorBo in Compiler Development
собсно у нас в дотнете так сравнение строк работает - мы просто сравниваем их через SSE/AVX но как только натыкаемся на чото не ASCII - сразу в медленный фоллбек.
источник

E

EgorBo in Compiler Development
но я не уверен на 100%)
источник

M

MaxGraey in Compiler Development
Ну в C# и Java есть compact strings да. но по условию обе строки должны быть в ASCII / Latin1
источник

E

EgorBo in Compiler Development
в шарпе нет пока)
источник

А⚙

Антон ⚙️ in Compiler Development
EgorBo
только если ты сперва проведешь анализ что там все символы ASCII
Чего блять
источник

E

EgorBo in Compiler Development
джависты решили пойти путем компактинга, а мы - путем добавления отдельного типа Utf8String с utf8 литералами
источник

M

MaxGraey in Compiler Development
EgorBo
в шарпе нет пока)
Хм, я думал вы уже реализовали. Кто то там из ваших очешь хотел использовать редундатные байты в хедере для строк)
источник