Rust v1.55.0 发布(2021-09-10),其中 标准库对浮点解析的实现更新为 Eisel-Lemire 算法,更快、更准确,覆盖了边界情况
Go 1.16(2021-02-16) strcov包的ParseFloat方法,也改成了使用Eisel-Lemire 算法实现:
1 | strconv |
【发起分享提案】分析 Eisel-Lemire 算法 #719
The Eisel-Lemire ParseNumberF64 Algorithm
https://go-review.googlesource.com/c/go/+/260858
https://go-review.googlesource.com/c/go/+/264517
Eisel-Lemire算法是什么?有何作用?有何优势?在rust和go中有没有用到?请举例说明
Eisel-Lemire算法是一种高效的数字字符串到浮点数的解析算法。这种算法由Daniel Lemire和其他合作者提出,目标是加速JSON等格式数据中数字到浮点数的转换过程。相比传统的解析方法,Eisel-Lemire算法能显著提高解析速度,同时保持高精度。
作用
Eisel-Lemire算法的主要作用是将文本形式的数字字符串快速准确地转换成浮点数(如double)。这在处理大量数据时尤其重要,比如解析JSON、CSV文件或任何包含大量浮点数字的文本数据。
优势
- 速度快:与传统的基于逐字符分析和转换的方法相比,Eisel-Lemire算法能更快地完成转换,因为它利用了现代处理器的向量化指令和更有效的数学运算策略。
- 精确度高:算法设计确保了转换过程中的精确度,减少了舍入误差。
- 通用性:适用于多种编程语言和平台,能被集成到各种需要快速浮点数解析的场景中。
在Rust和Go中的应用
Rust:在Rust中,有一些JSON解析库可能会采用Eisel-Lemire算法或类似的优化方法来提高解析性能。例如,
serde_json是Rust中最常用的JSON序列化和反序列化库之一,虽然直接使用Eisel-Lemire算法的证据可能不明显,但类似的性能优化技术是可能被采纳的。Rust社区非常注重性能,因此在需要处理大量浮点数数据的场合,采用高效算法是符合Rust哲学的。Go:Go语言的标准库或第三方库中可能也有采用Eisel-Lemire算法的情况,尤其是在JSON处理、数据分析和科学计算等领域。Go的
encoding/json包负责处理JSON的编码和解码,虽然Go官方文档中没有直接提到Eisel-Lemire算法,但Go社区和第三方库中可能存在采用此算法或其他优化方法以提升浮点数解析性能的实现。
举例说明
由于Eisel-Lemire算法的具体实现细节较为复杂,涉及底层的数位操作和数学理论,这里不展示具体的Rust或Go代码实现。感兴趣的开发者可以查阅相关的学术论文或开源实现。如果你需要在Rust或Go中利用这种算法的性能优势,建议寻找已经集成了该算法的第三方库,或者关注这两个语言生态系统中性能相关的更新和讨论。
总的来说,Eisel-Lemire算法是数字字符串解析领域的一项重要进展,它提供了一种既快速又精确的转换方法。尽管直接在语言标准库中使用的证据可能不多,但该算法及其思想可能已经在性能关键的库中得到应用。
原文链接: https://dashen.tech/2020/04/17/Eisel-Lemire算法与浮点数解析/
版权声明: 转载请注明出处.