LINUX.ORG.RU

Добавляет ли тормоза UTF8?

 


0

2

Написал небольшой поисковичок на JS, который производит поиск по массиву строк, по регекспам, и заметил тормоза на слабом железе. Перекодировал в cp1251, тормоза исчезли. Может просто совпадение, хз, может алгоритм поиска кривой, но в данный момент меня интересует, на сколько (в процентах, в среднем) способна затормозить кодировка? И какая кодировка для нац алфавита оптимальна для парсинга и быстроты исполнения (ведь есть кроме cp1251 еще, например, ibm866, еще там какие-то)? Может имеет смысл вообще отказаться от UTF?

UPD Если чо, мне никакие спецсимволы и прочие извраты не нужны, парсится текст, содержащий только обычные символы алфавита знаки препинания и цифры



Последнее исправление: anonimous (всего исправлений: 1)

Используй КОИ8-Р!

Deleted
()

еще есть utf16, он быстрее чем utf8. для поиска и сортировки — utf8 самый медленный. в сишечке можно хорошо оптимизнуть. в js нельзя.

waker ★★★★★
()

на сколько (в процентах, в среднем) способна затормозить кодировка?

Тормозит не кодировка, а её обработчик. Почитай, как работает тот что ты используешь.

vurdalak ★★★★★
()

если символы вне cp1251 не нужны вообще — я бы использовал cp1251. сортировка и поиск в utf8 — это ад. и тормоза.

waker ★★★★★
()
Ответ на: комментарий от ii343hbka

не всегда фиксированно 2 байта, но в большинстве случаев будет 2 байта на символ, поэтому алгоритмическая сложность такая же, как у того же cp1251 или koi8-r, минус накладные расходы на двойной размер.

когда символ в 2 байта не влазит — будет еще хуже чем с utf8.

если нужен уникод с фиксированным размером код-пойнтов — то только utf32.

waker ★★★★★
()
Ответ на: комментарий от ii343hbka

а почему так? потому что фиксированно 2 байта? мне правда интересно :)

Это, кстати, распространенное заблуждение. В utf16 не фиксированное колчество байт на символ.

Waterlaz ★★★★★
()
Ответ на: комментарий от vurdalak

Тормозит не кодировка, а её обработчик. Почитай, как работает тот что ты используешь.

а сложность обработчика, и его тормознутость, напрямую вытекает из кодировки. man fixed vs variable-length encodings.

waker ★★★★★
()
Ответ на: комментарий от fornlr

архитектура, с двойным словом быстрее всего

1-байтовый fixed-length encoding быстрее.

waker ★★★★★
()

Если тебе нужна сортировка, то все-таки не КОИ8-Р, а 1251 или 866. В КОИ символы идут не по алфавиту, поэтому сортировка выполняется таблично, т.е. медленнее, чем тупо сравнением кодов.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от CYB3R

В наше время — ни в чем. Семибитных линий связи уже давно нет. Просто привычка.

Eddy_Em ☆☆☆☆☆
()

Добавляет ли тормоза UTF8?

да, конечно

umren ★★★★★
()
Ответ на: комментарий от PreciousProtection

Да. Но насколько заметна разница — зависит от обработчика.

vurdalak ★★★★★
()

Движки JS оптимизированы под работу с UTF-строками, так что если юзать регулярки, то отказываться не надо. Может, в алгоритме что-то не так? Вообще, какой движок JS используется?

border-radius
()
Ответ на: комментарий от ii343hbka

Потому что меньше особых случаев, которые надо обрабатывать.

В UTF-16 такой случай только один — непарные суррогаты. Все остальные пары байтов технически корректны. В UTF-8 случаев шесть семь: преждевременный обрыв последовательности; использование пяти- и шестибайтовых последовательностей; использование четырёхбайтовых последовательностей, кодирующих значения больше 10FFFF; overlong encoding; использование суррогатов; использование байтов FE и FF; некорректное начало последовательности. Каждый из этих случаев необходимо корректно обрабатывать.

Кроме того, меньше вариантов кодирования. В UTF-16 большая часть реально используемых символов влазит в два байта, поэтому некоторые тормоза с суррогатами приемлемы. В UTF-8 популярные символы занимают уже один, два, или три байта.

У UTF-8 есть свои плюсы: самосинхронизируемость и детектирование помех; совместимость с ASCII; меньше места на тексты, состоящие преимущественно из ASCII; независимость от порядка байт в слове. Но, очевидно, это не самая удобная кодировка для обработки строк в памяти. UTF-8 — хорошая кодировка для передачи и хранения строк.

ilammy ★★★
()
Последнее исправление: ilammy (всего исправлений: 1)

Написал небольшой поисковичок на JS

Скажи, а как именно ты задавал JS кодировку символов?

abs ★★★
()
Ответ на: комментарий от abs

Никак. Я первый раз слышу такое. На серверном js можно задать кодировку при операциях с файловой системой. А в браузерном — я хз. Строчку в НТМL поставил: <meta http-equiv=«content-type» content=«text/html; charset=windows-1251»/>, больше ничего. Я в этом особо не разбираюсь, если честно.

anonimous
() автор топика
Ответ на: комментарий от border-radius

v8. Кстати, тормозило изначально только на нем. Проверял в опере и фф — все нормально. Но мне нужен именно v8.

anonimous
() автор топика
Ответ на: комментарий от Suntechnic

запросов

А что запросы? там что, спецсимволы чтоли? нахрена там UTF8?

anonimous
() автор топика
Ответ на: комментарий от anonimous

Тогда всё-таки копай алгоритм. V8 тем более оптимизирован для UTF-строк, а при перекодировке, кстати, регулярки могут срабатывать некорректно.

border-radius
()
Ответ на: комментарий от anonimous

"Поздравляю, Шарик, ты балбес". Метатеги указывают только на кодировку, в которой браузер будет отображать страницу, на строки в JS совершенно не влияют. Проблема однозначно в чём-то другом.

border-radius
()
Ответ на: комментарий от Suntechnic

Браузерный JS, по идее, работает только с UTF-8

Ты еще скажи, что сишечка работает только с UTF-32..

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от border-radius

Ты хочешь сказать, что существуют какие-то отдельные директивы для браузерного JS-движка, задающие обработку строк в определенной кодировке?

anonimous
() автор топика
Ответ на: комментарий от border-radius

Я ни хрена не могу понять, о чем ты говоришь. Если с сервера придет документ с 866, например, откуда возьмется это «внутреннее представление»

anonimous
() автор топика
Ответ на: комментарий от anonimous

Если с сервера придет документ в 866, то при попытке, например, вывести его на консоль V8 всё равно будет пытаться распарсить его как UTF-8.

border-radius
()
Ответ на: комментарий от anonimous

Всё. Я раскопал откуда такая инфа даже. Не обращай внимание это была глупость которую я вычитал в глупом источники и которая была многократно подтверждена практикой, но на самом деле и правда не имеет никакого отношения к действительности.

Suntechnic ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.