以安全的 Rust 方式切片 XML 字符串

Slicing XML strings in a safe, Rust way

我正在解析 XML,我们发现 XML 解析器花费了大量时间来检查 UTF 兼容性,这是不必要的。例如,假设我正在解析类似于以下内容的内容:

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

在我们的火焰图中,我们会花很多时间检查 rootß❤ 是否是有效的 UTF。

避免此检查的一种方法是有一个先决条件,即 XML 输入是有效的 Rust &str。因为它是并且分隔符是基于 ASCII 的,所以理论上,在任何两个 ASCII 分隔符之间的切片应该产生有效的 &str,我们不会检查它。

这是一个安全的假设吗?或者更好的是,是否有一个箱子可以做类似的事情(例如 CSV)?

我想大多数 XML 解析器都会在整个输入流级别检查有效的 UTF-8 编码,然后在 "root" 的更高级别进行进一步检查和“ß❤”是有效的 XML 名称。您确实观察到这些检查可能代价高昂并且有优化的机会;并且这些机会之一可能是利用 UTF-8 编码原则确保八位字节 x3C 永远不会出现在 UTF-8 流中,除非作为字符“<”的表示。

您还可以通过完全删除一些检查来降低解析成本。不检测所有错误的解析器不符合 W3C 标准,但这并不意味着它毫无用处。但是,请注意不要以牺牲其他一切为代价而沉迷于性能:对于 95% 的用户来说,产生良好的错误消息可能至少值得 10% 的性能开销。