Description
See Daniel Lemire's (@lemire) blogpost: https://lemire.me/blog/2021/02/22/parsing-floating-point-numbers-really-fast-in-c - a super fast floating-point parsing algorithm which is up to 6 times faster than the BCL one for an average case (for invariant culture).
| Method | FileName | Mean | Error | StdDev | Min | Ratio | Gen 0 | Gen 1 | Gen 2 | Allocated | MFloat/s | MB/s |
|--------------------------- |---------------- |----------:|----------:|----------:|----------:|------:|------:|------:|------:|----------:|---------:|---------:|
| FastFloat.ParseDouble() | data/canada.txt | 5.974 ms | 0.0060 ms | 0.0053 ms | 5.965 ms | 0.16 | - | - | - | 2 B | 18.63 | 350.04 |
| Double.Parse() | data/canada.txt | 37.459 ms | 0.2417 ms | 0.2142 ms | 37.003 ms | 1.00 | - | - | - | 21 B | 3.00 | 56.43 |
| | | | | | | | | | | | | |
| FastFloat.ParseDouble() | data/mesh.txt | 1.815 ms | 0.0144 ms | 0.0134 ms | 1.798 ms | 0.26 | - | - | - | 1 B | 40.61 | 344.84 |
| Double.Parse() | data/mesh.txt | 6.911 ms | 0.1136 ms | 0.1062 ms | 6.758 ms | 1.00 | - | - | - | 2 B | 10.81 | 91.75 |
The algorithm: https://arxiv.org/abs/2101.11408 (and https://nigeltao.github.io/blog/2020/eisel-lemire.html)
Its C# port (by @CarlVerret): https://github.com/CarlVerret/csFastFloat
The current implementation supports "scientific", "fixed" and "general" formats, and a custom decimal separator (single char
)
what else is needed for a proper integration into dotnet/runtime
?
The implementation takes roughly 25Kb (~10kb of it is spent here https://github.com/CarlVerret/csFastFloat/blob/master/csFastFloat/Constants/Constants.cs#L22 - can be converted to a ROS<byte>
?) of IL byte code.
Go lang switched to that algorithm in 1.16 (see strconv
https://golang.org/doc/go1.16#strconv)
/cc @tannergooding