?

Log in

No account? Create an account
nyaload

Журнал Пушыстого

Журнал Пушыстого

Previous Entry Share Next Entry
fast utf-8 validation
nyaload
_winnie
Наткнулся на простую и быструю библиотеку декодирования UTF-8, кроссплатформенную, с валидацией всех возможных ошибок в utf-8 (overlong, surrogate pairs) - http://bjoern.hoehrmann.de/utf-8/decoder/dfa , без бранчинга ( «?:» заменяется на стандатный битхак mask=((int)x-1)>>31), легко векторизуется до чтения dword/qword. Декодирование рассматривается как конечный автомат, конечный автомат загонятся в таблицу [char x state] →state

Протестировал брутфорсом, работает эквивалентно iconv (в плюс iconv - он умеет детектить суррогатные пары, но что с ними делать - оставляет решать пользователю).

Не законом Мура единым ускоряем софт
Tags:

  • 1
((x>=0) ? a : b) , где x - 32-битный signed заменяется на

mask = (x>>31);
(~mask & b) | (mask & a)


Стоит ли так делать - зависит от компилятора и процессора, я ещё не измерял. Если b - это array[index], то компилятору сложнее самому выкинуть бранч.


Edited at 2013-03-22 10:39 am (UTC)

Теперь верю. Это симуляция predication. Единственное, что в теории сдвиг знаковых в Си++ стандарте не определен. На практике: в gcc, vc (Intel) мы знаем как оно будет работать.

  • 1