我正在解析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% 的性能开销。