Since Spirit X3 is available for testing, I've updated the benchmarks. Meanwhile I've used Nonius to get statistically sound benchmarks.
All charts below are available interactive online
Benchmark CMake project + testdata used is on github: https://github.com/sehe/bench_float_parsing/blob/master/bench_float_parsing.html
Spirit parsers are fastest. If you can use C++14 consider the experimental version Spirit X3:
The above is measures using memory mapped files. Using IOstreams, it will be slower accross the board,
but not as slow as scanf
using C/POSIX FILE*
function calls:
What follows is parts from the OLD answer
I implemented the Spirit version, and ran a benchmark comparing to the other suggested answers.
Here's my results, all tests run on the same body of input (515Mb of
input.txt
). See below for exact specs.
(wall clock time in seconds, average of 2+ runs)To my own surprise, Boost Spirit turns out to be fastest, and most elegant:
handles/reports errors
supports +/-Inf and NaN and variable whitespace
no problems at all detecting the end of input (as opposed to the other mmap answer)
looks nice:
bool ok = phrase_parse(f,l, // source iterators (double_ > double_ > double_) % eol, // grammar blank, // skipper data); // output attribute
Note that
boost::spirit::istreambuf_iterator
was unspeakably much slower (15s+). I hope this helps!All parsing done into
vector
ofstruct float3 { float x,y,z; }
.Generate input file using
od -f -A none --width=12 /dev/urandom | head -n 11000000
This results in a 515Mb file containing data like
-2627.0056 -1.967235e-12 -2.2784738e+33 -1.0664798e-27 -4.6421956e-23 -6.917859e+20 -1.1080849e+36 2.8909405e-33 1.7888695e-12 -7.1663235e+33 -1.0840628e+36 1.5343362e-12 -3.1773715e-17 -6.3655537e-22 -8.797282e+31 9.781095e+19 1.7378472e-37 63825084 -1.2139188e+09 -5.2464635e-05 -2.1235992e-38 3.0109424e+08 5.3939846e+30 -6.6146894e-20
Compile the program using:
g++ -std=c++0x -g -O3 -isystem -march=native test.cpp -o test -lboost_filesystem -lboost_iostreams
Measure wall clock time using
time ./test < input.txt
- Linux desktop 4.2.0-42-generic #49-Ubuntu SMP x86_64
- Intel(R) Core(TM) i7-3770K CPU @ 3.50GHz
- 32GiB RAM
Full code to the old benchmark is in the edit history of this post, the newest version is on github