miloyip/dtoa-benchmark — dự án mã nguồn mở — đang có 258 sao GitHub. C++ double-to-string conversion benchmark
Tóm tắt dựng từ metadata GitHub của chính dự án — chưa có bài review TopGit. Trang sẽ tự động cập nhật khi bài review đầy đủ được xuất bản.
VÌ SAO CHƯA CÓ REVIEW
TopGit viết bài đầy đủ cho repo có nhiều sao nhất và được yêu cầu nhiều nhất. Trang này là snapshot trong thời gian chờ — xem README gốc ở tab READ ME.
This benchmark evaluates the performance of conversion from double precision IEEE-754 floating point (double) to ASCII string. The function prototype is:
void dtoa(double value, char* buffer);
The character string result must be convertible to the original value exactly via some correct implementation of strtod(), i.e. roundtrip convertible.
Note that dtoa() is not a standard function in C and C++.
Procedure
Firstly the program verifies the correctness of implementations.
Then, one case for benchmark is carried out:
RandomDigit: Generates 1000 random double values, filtered out +/-inf and nan. Then convert them to limited precision (1 to 17 decimal digits in significand). Finally convert these numbers into ASCII.
Each digit group is run for 100 times. The minimum time duration is measured for 10 trials.
Build and Run
Obtain premake4.
Copy premake4 executable to dtoa-benchmark/build folder (or system path).
Run premake.bat or premake.sh in dtoa-benchmark/build
On Windows, build the solution at dtoa-benchmark/build/vs2008/ or /vs2010/.
On other platforms, run GNU make config=release32 (or release64) at dtoa-benchmark/build/gmake/
On success, run the dtoa executable is generated at dtoa-benchmark/
The results in CSV format will be written to dtoa-benchmark/result.
Run GNU make in dtoa-benchmark/result to generate results in HTML.
Results
The following are sequential results measured on a PC (Core i7 920 @2.67Ghz), where u32toa() is compiled by Visual C++ 2013 and run on Windows 64-bit. The speedup is based on sprintf().
Function
Time (ns)
Speedup
ostringstream
2,778.748
0.45x
ostrstream
2,628.365
0.48x
gay
1,646.310
0.76x
sprintf
1,256.376
1.00x
fpconv
273.822
4.59x
grisu2
220.251
5.70x
doubleconv
201.645
6.23x
milo
138.021
9.10x
null
2.146
585.58x
Note that the null implementation does nothing. It measures the overheads of looping and function call.
Some results of various configurations are located at dtoa-benchmark/result. They can be accessed online, with interactivity provided by Google Charts:
std::ostringstream in C++ standard library with setprecision(17).
ostrstream
std::ostrstream in C++ standard library with setprecision(17).
sprintf
sprintf() in C standard library with "%.17g" format.
stb_sprintf
fast sprintf replacement with "%.17g" format.
gay
David M. Gay's dtoa() C implementation.
grisu2
Florian Loitsch's Grisu2 C implementation [1].
doubleconv
C++ implementation extracted from Google's V8 JavaScript Engine with EcmaScriptConverter().ToShortest() (based on Grisu3, fall back to slower bignum algorithm when Grisu3 failed to produce shortest implementation).
fpconv
night-shift's Grisu2 C implementation.
milo
miloyip's Grisu2 C++ header-only implementation.
null
Do nothing.
Notes:
tostring() is not tested as it does not fulfill the roundtrip requirement.
Grisu2 is chosen because it can generate better human-readable number and >99.9% of results are in shortest. Grisu3 needs another dtoa() implementation for not meeting the shortest requirement.
FAQ
How to add an implementation?
You may clone an existing implementation file. And then modify it. Re-run premake to add it to project or makefile. Note that it will automatically register to the benchmark by macro REGISTER_TEST(name).
Making pull request of new implementations is welcome.
Why not converting double to std::string?
It may introduce heap allocation, which is a big overhead. User can easily wrap these low-level functions to return std::string, if needed.
Why fast dtoa() functions is needed?
They are a very common operations in writing data in text format. The standard way of sprintf(), std::stringstream, often provides poor performance. The author of this benchmark would optimize the sprintf implementation in RapidJSON, thus he creates this project.
References
[1] Loitsch, Florian. "Printing floating-point numbers quickly and accurately with integers." ACM Sigplan Notices 45.6 (2010): 233-243.
Trang TopGit này là một snapshot — tab "Readme" hiển thị nguyên văn README của repo (đã bỏ link, giữ ảnh). Repo GitHub ở github.com/miloyip/dtoa-benchmark là nguồn chính thức.
miloyip/dtoa-benchmark có bao nhiêu sao?
miloyip/dtoa-benchmark có 258 sao GitHub — tải lại trang để xem số mới nhất, hoặc xem trực tiếp github.com/miloyip/dtoa-benchmark. TopGit phản chiếu số sao của GitHub nhưng không cam kết đến từng phút.
miloyip/dtoa-benchmark có phải mã nguồn mở không?
Có — miloyip/dtoa-benchmark phát hành theo license MIT, nghĩa là mã nguồn mở để đọc, fork và (tùy license) tái sử dụng. Mã: github.com/miloyip/dtoa-benchmark.
miloyip/dtoa-benchmark còn đang phát triển không?
Commit gần nhất trên miloyip/dtoa-benchmark là 4.5 năm trước (theo timestamp GitHub). Repo có 48 fork — một chỉ báo về mức độ quan tâm của cộng đồng.
miloyip/dtoa-benchmark là gì?
miloyip/dtoa-benchmark (miloyip/dtoa-benchmark) là dự án C++ trên GitHub. Theo mô tả gốc: C++ double-to-string conversion benchmark
Đọc đầy đủ README ở tab phía trên.
Chưa chắc dtoa-benchmark có hợp với bạn?
Để ChatGPT, Claude hoặc Perplexity tìm hiểu giúp — bấm bên dưới và xem AI nói gì về dtoa-benchmark.