csFastFloat 4.0.0
See the version list below for details.
dotnet add package csFastFloat --version 4.0.0
NuGet\Install-Package csFastFloat -Version 4.0.0
<PackageReference Include="csFastFloat" Version="4.0.0" />
paket add csFastFloat --version 4.0.0
#r "nuget: csFastFloat, 4.0.0"
// Install csFastFloat as a Cake Addin #addin nuget:?package=csFastFloat&version=4.0.0 // Install csFastFloat as a Cake Tool #tool nuget:?package=csFastFloat&version=4.0.0
csFastFloat : a fast and accurate float parser
C# port of Daniel Lemire's fast_float fully ported from C++ to C#. It is up to 9 times faster than the standard library in some cases while providing exact results.
Benchmarks
We use the realistic files in /data. The mesh.txt data file contains numbers that are easier to parse whereas the canada.txt data file is representative of a more challenging scenario. Synthetic.txt contains 150 000 random floats. We compare the Double.Parse()
function from the runtime library with our FastFloat.ParseDouble()
function. The ParseNumberString() only
function parses the string itself without any float computation: it might represent an upper bound on the possible performance.
BenchmarkDotNet=v0.12.1, OS=ubuntu 20.04 (container)
AMD EPYC 7262, 1 CPU, 16 logical and 8 physical cores
.NET Core SDK=5.0.102
[Host] : .NET Core 5.0.2 (CoreCLR 5.0.220.61120, CoreFX 5.0.220.61120), X64 RyuJIT
.NET Core 5.0 : .NET Core 5.0.2 (CoreCLR 5.0.220.61120, CoreFX 5.0.220.61120), X64 RyuJIT
Job=.NET Core 5.0 Runtime=.NET Core 5.0
| Method | FileName | Mean | Min | Ratio | MFloat/s | MB/s |
|------------------------------- |------------------- |----------:|----------:|------:|---------:|---------:|
| FastFloat.TryParseDouble() | data/canada.txt | 4.586 ms | 4.559 ms | 0.12 | 24.38 | 458.00 |
| 'ParseNumberString() only' | data/canada.txt | 2.472 ms | 2.411 ms | 0.07 | 46.10 | 866.13 |
| Double.Parse() | data/canada.txt | 37.537 ms | 37.159 ms | 1.00 | 2.99 | 56.19 |
| | | | | | | |
| FastFloat.TryParseDouble() | data/mesh.txt | 1.834 ms | 1.834 ms | 0.27 | 39.81 | 338.05 |
| 'ParseNumberString() only' | data/mesh.txt | 1.168 ms | 1.164 ms | 0.17 | 62.71 | 532.43 |
| Double.Parse() | data/mesh.txt | 6.850 ms | 6.788 ms | 1.00 | 10.76 | 91.34 |
| | | | | | | |
| FastFloat.TryParseDouble() | data/synthetic.txt | 5.147 ms | 5.118 ms | 0.11 | 29.31 | 551.44 |
| 'ParseNumberString() only' | data/synthetic.txt | 2.655 ms | 2.653 ms | 0.05 | 56.54 | 1063.78 |
| Double.Parse() | data/synthetic.txt | 48.744 ms | 48.283 ms | 1.00 | 3.11 | 58.45 |
In this repo FastFloatTestBench we demonstrate a concrete performance gain obtained with FastFloat.ParseDouble() with the CSVHelper library. This is one of the fastest CSV parser available.
Single and multiple columns files have been tested. :
- Canada.txt, mesh.txt and Synthetic.txt are the same from previous benchmark.
- World cities population data (100k/300k) are real data obtained from OpenDataSoft.
Benchmark is run on same environment.
BenchmarkDotNet=v0.12.1, OS=ubuntu 20.04 (container)
AMD EPYC 7262, 1 CPU, 16 logical and 8 physical cores
.NET Core SDK=5.0.102
[Host] : .NET Core 5.0.2 (CoreCLR 5.0.220.61120, CoreFX 5.0.220.61120), X64 RyuJIT
.NET Core 5.0 : .NET Core 5.0.2 (CoreCLR 5.0.220.61120, CoreFX 5.0.220.61120), X64 RyuJIT
Job=.NET Core 5.0 Runtime=.NET Core 5.0
| Method | fileName | fileSize | nbFloat | Mean | Error | StdDev | Min | Ratio | MFloat/s |
|-------------------------------------- |----------------------- |--------- |-------- |----------:|---------:|---------:|----------:|------:|---------:|
| 'Double.Parse() - singlecol' | TestData/canada.txt | 2088 | 111126 | 84.46 ms | 0.271 ms | 0.226 ms | 84.16 ms | 1.00 | 1.32 |
| 'Zeroes - singlecol' | TestData/canada.txt | 2088 | 111126 | 33.59 ms | 0.214 ms | 0.178 ms | 33.21 ms | 0.40 | 3.35 |
| 'FastFloat.ParseDouble() - singlecol' | TestData/canada.txt | 2088 | 111126 | 40.58 ms | 0.265 ms | 0.235 ms | 40.13 ms | 0.48 | 2.77 |
| | | | | | | | | | |
| 'Double.Parse() - singlecol' | TestData/mesh.txt | 691 | 73019 | 29.64 ms | 0.157 ms | 0.146 ms | 29.41 ms | 1.00 | 2.48 |
| 'Zeroes - singlecol' | TestData/mesh.txt | 691 | 73019 | 17.68 ms | 0.077 ms | 0.064 ms | 17.58 ms | 0.60 | 4.15 |
| 'FastFloat.ParseDouble() - singlecol' | TestData/mesh.txt | 691 | 73019 | 20.06 ms | 0.188 ms | 0.176 ms | 19.82 ms | 0.68 | 3.68 |
| | | | | | | | | | |
| 'Double.Parse() - singlecol' | TestData/synthetic.txt | 2969 | 150000 | 114.10 ms | 1.355 ms | 1.202 ms | 111.87 ms | 1.00 | 1.34 |
| 'Zeroes - singlecol' | TestData/synthetic.txt | 2969 | 150000 | 46.48 ms | 0.197 ms | 0.184 ms | 46.20 ms | 0.41 | 3.25 |
| 'FastFloat.ParseDouble() - singlecol' | TestData/synthetic.txt | 2969 | 150000 | 54.29 ms | 0.683 ms | 0.605 ms | 53.40 ms | 0.48 | 2.81 |
| | | | | | | | | | |
| 'Double.Parse() - multicol' | TestData/w-c-100K.csv | 4842 | 200002 | 182.30 ms | 2.629 ms | 2.459 ms | 179.70 ms | 1.00 | 1.11 |
| 'Zeroes() - multicol' | TestData/w-c-100K.csv | 4842 | 200002 | 160.47 ms | 1.368 ms | 1.068 ms | 158.88 ms | 0.88 | 1.26 |
| 'FastFloat.Parse() - multicol' | TestData/w-c-100K.csv | 4842 | 200002 | 168.60 ms | 1.217 ms | 1.079 ms | 166.84 ms | 0.92 | 1.20 |
| | | | | | | | | | |
| 'Double.Parse() - multicol' | TestData/w-c-300K.csv | 14526 | 600002 | 572.31 ms | 4.286 ms | 3.799 ms | 566.87 ms | 1.00 | 1.06 |
| 'Zeroes() - multicol' | TestData/w-c-300K.csv | 14526 | 600002 | 451.54 ms | 3.379 ms | 2.822 ms | 445.87 ms | 0.79 | 1.35 |
| 'FastFloat.Parse() - multicol' | TestData/w-c-300K.csv | 14526 | 600002 | 479.76 ms | 3.103 ms | 2.423 ms | 477.05 ms | 0.84 | 1.26 |
Requirements
.NET Core 3.1 or newer. Under .NET 5 framework, the library takes advantage of the new Math.BigMul() function.
Compile and testing
As this library targets multiple framework, you can specify the target framework version with -f parameter :
dotnet build -c Release -f net5.0
dotnet test -f net5.0
If you omit the target framework and you don't have both .net 5.0 and dotnetcore 3.1 SDKs installed you may experience an error when building or running tests.
The set of unit tests in /TestcsFastFloat project combines unit tests from many libraries. It includes tests used by the Go Team. Additionnal info on Nigel Tao's work can be found here.
Some unit tests are based on Approvals.net library. They require a diff tool installed on your computer. Tests will be automatically skiped if no diff tool is found.
Usage
Two functions are available: FastDoubleParser.ParseDouble
and FastFloatParser.ParseFloat
. Since v3.0, TryParse pattern is supported for each function.
String
, char *
and ReadOnlySpan<char>
are supported inputs.
using csFastFloat;
double x;
float y;
double z;
double answer = 0;
foreach (string l in lines)
{
x = FastDoubleParser.ParseDouble(l);
FastDoubleParser.TryParseDouble(l, out z);
y = FastFloatParser.ParseFloat(l);
}
Input strings are expected to be valid UTF-16.
Trailing content in the string is ignored. You may pass an optional out int characters_consumed
parameter
FastDoubleParser.ParseDouble(l, out int characters_consumed)
if you wich to check how many characters were processed. Some users may want to fail when the number of characters consumed does not match the string length.
For UTF-8 or ASCII inputs, you may pass a ReadOnlySpan<byte>
argument. You can also pass
an optional out int characters_consumed
parameter to track the number of characters consumed
by the number pattern.
Credit
This library is the main project in my master's degree under the direction of Professor Daniel Lemire at TELUQ University. A special thanks to Egor Bogatov and all contributors for their really meaningful contribution.
Reference
- Daniel Lemire, Number Parsing at a Gigabyte per Second, Software: Pratice and Experience 51 (8), 2021.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 is compatible. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 is compatible. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETCoreApp 3.1
- No dependencies.
-
.NETStandard 2.0
- System.Memory (>= 4.5.4)
- System.Runtime.CompilerServices.Unsafe (>= 5.0.0)
-
net5.0
- No dependencies.
NuGet packages (5)
Showing the top 5 NuGet packages that depend on csFastFloat:
Package | Downloads |
---|---|
Sep
World's Fastest .NET CSV Parser. Modern, minimal, fast, zero allocation, reading and writing of separated values (csv, tsv etc.). Cross-platform, trimmable and AOT/NativeAOT compatible. |
|
GeometryDashAPI
API for game Geometry Dash |
|
PlistAPI
Plist API that allows to serialize and deserialize directly as a specific objects |
|
DNV.Sesam.Sif.Decoder
Package Description |
|
CSVParse
An ultra-fast CSV parser. |
GitHub repositories (2)
Showing the top 2 popular GitHub repositories that depend on csFastFloat:
Repository | Stars |
---|---|
nietras/Sep
World's Fastest .NET CSV Parser. Modern, minimal, fast, zero allocation, reading and writing of separated values (`csv`, `tsv` etc.). Cross-platform, trimmable and AOT/NativeAOT compatible.
|
|
stark-lang/stark
Main repository for the stark compiler frontend + vscode integration + language specs
|