Нарезка XML струн безопасным способом Rust - PullRequest
2 голосов
/ 19 января 2020

Я работаю над синтаксическим анализом XML, и мы обнаружили, что парсер XML потратил много времени, бесполезно проверяя совместимость UTF. Например, допустим, я анализирую что-то похожее на:

<root><ß❤></ß❤></root>

В наших пламенных графиках мы потратили бы много времени на проверку того, был ли root или ß❤ действительным UTF.

Одним из способов избежать этой проверки является предварительное условие, что XML ввод действителен Rust &str. Поскольку это так, а разделители основаны на ASCII, теоретически разделение между любыми двумя разделителями ASCII должно давать valid & str, который мы не будем проверять.

Это безопасное предположение? Или даже лучше, есть ли ящик, который делает что-то подобное (например, CSV)?

1 Ответ

2 голосов
/ 19 января 2020

Я предполагаю, что большинство парсеров XML проверят правильность кодировки UTF-8 на уровне входного потока в целом, а затем выполнят дальнейшие проверки на более высоком уровне, чем "root" и "ß❤ "действительны XML имена. Вы, безусловно, правы, заметив, что эти проверки могут быть дорогостоящими и что есть возможности для оптимизации; и что одна из этих возможностей может заключаться в том, чтобы воспользоваться тем фактом, что принципы кодирования UTF-8 гарантируют, что октет x3 C никогда не встречается в потоке UTF-8, за исключением представления символа "<". </p>

Вы также можете сократить расходы на синтаксический анализ, полностью исключив некоторые проверки. Парсер, который не обнаруживает все ошибки, не соответствует стандартам W3 C, но это не делает его бесполезным. Однако остерегайтесь одержимости производительностью за счет всего остального: для 95% ваших пользователей создание хороших сообщений об ошибках, вероятно, стоит не менее 10% снижения производительности.

...