mirror of
https://github.com/fmtlib/fmt.git
synced 2025-07-31 03:07:36 +02:00
Update readme
This commit is contained in:
223
README.rst
223
README.rst
@ -57,21 +57,14 @@ See the `documentation <http://fmtlib.net/latest/>`_ for more details.
|
|||||||
Examples
|
Examples
|
||||||
--------
|
--------
|
||||||
|
|
||||||
This prints ``Hello, world!`` to stdout:
|
Print ``Hello, world!`` to ``stdout``:
|
||||||
|
|
||||||
.. code:: c++
|
.. code:: c++
|
||||||
|
|
||||||
fmt::print("Hello, {}!", "world"); // uses Python-like format string syntax
|
fmt::print("Hello, {}!", "world"); // uses Python-like format string syntax
|
||||||
fmt::printf("Hello, %s!", "world"); // uses printf format string syntax
|
fmt::printf("Hello, %s!", "world"); // uses printf format string syntax
|
||||||
|
|
||||||
Arguments can be accessed by position and arguments' indices can be repeated:
|
Check a format string at compile time:
|
||||||
|
|
||||||
.. code:: c++
|
|
||||||
|
|
||||||
std::string s = fmt::format("{0}{1}{0}", "abra", "cad");
|
|
||||||
// s == "abracadabra"
|
|
||||||
|
|
||||||
Format strings can be checked at compile time:
|
|
||||||
|
|
||||||
.. code:: c++
|
.. code:: c++
|
||||||
|
|
||||||
@ -94,7 +87,7 @@ Format strings can be checked at compile time:
|
|||||||
context_.on_error("argument index out of range");
|
context_.on_error("argument index out of range");
|
||||||
^
|
^
|
||||||
|
|
||||||
{fmt} can be used as a safe portable replacement for ``itoa``
|
Use {fmt} as a safe portable replacement for ``itoa``
|
||||||
(`godbolt <https://godbolt.org/g/NXmpU4>`_):
|
(`godbolt <https://godbolt.org/g/NXmpU4>`_):
|
||||||
|
|
||||||
.. code:: c++
|
.. code:: c++
|
||||||
@ -129,7 +122,7 @@ Formatting of user-defined types is supported via a simple
|
|||||||
std::string s = fmt::format("The date is {}", date{2012, 12, 9});
|
std::string s = fmt::format("The date is {}", date{2012, 12, 9});
|
||||||
// s == "The date is 2012-12-9"
|
// s == "The date is 2012-12-9"
|
||||||
|
|
||||||
You can create your own functions similar to `format
|
Create your own functions similar to `format
|
||||||
<http://fmtlib.net/latest/api.html#format>`_ and
|
<http://fmtlib.net/latest/api.html#format>`_ and
|
||||||
`print <http://fmtlib.net/latest/api.html#print>`_
|
`print <http://fmtlib.net/latest/api.html#print>`_
|
||||||
which take arbitrary arguments (`godbolt <https://godbolt.org/g/MHjHVf>`_):
|
which take arbitrary arguments (`godbolt <https://godbolt.org/g/MHjHVf>`_):
|
||||||
@ -152,6 +145,108 @@ Note that ``vreport_error`` is not parameterized on argument types which can
|
|||||||
improve compile times and reduce code size compared to fully parameterized
|
improve compile times and reduce code size compared to fully parameterized
|
||||||
version.
|
version.
|
||||||
|
|
||||||
|
Benchmarks
|
||||||
|
----------
|
||||||
|
|
||||||
|
Speed tests
|
||||||
|
~~~~~~~~~~~
|
||||||
|
|
||||||
|
================= ============= ===========
|
||||||
|
Library Method Run Time, s
|
||||||
|
================= ============= ===========
|
||||||
|
libc printf 1.01
|
||||||
|
libc++ std::ostream 3.04
|
||||||
|
{fmt} 1632f72 fmt::print 0.86
|
||||||
|
tinyformat 2.0.1 tfm::printf 3.23
|
||||||
|
Boost Format 1.67 boost::format 7.98
|
||||||
|
Folly Format folly::format 2.23
|
||||||
|
================= ============= ===========
|
||||||
|
|
||||||
|
{fmt} is the fastest of the benchmarked methods, ~17% faster than ``printf``.
|
||||||
|
|
||||||
|
The above results were generated by building ``tinyformat_test.cpp`` on macOS
|
||||||
|
10.14.3 with ``clang++ -O3 -DSPEED_TEST -DHAVE_FORMAT``, and taking the best of
|
||||||
|
three runs. In the test, the format string ``"%0.10f:%04d:%+g:%s:%p:%c:%%\n"``
|
||||||
|
or equivalent is filled 2,000,000 times with output sent to ``/dev/null``; for
|
||||||
|
further details refer to the `source
|
||||||
|
<https://github.com/fmtlib/format-benchmark/blob/master/tinyformat_test.cpp>`_.
|
||||||
|
|
||||||
|
Compile time and code bloat
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The script `bloat-test.py
|
||||||
|
<https://github.com/fmtlib/format-benchmark/blob/master/bloat-test.py>`_
|
||||||
|
from `format-benchmark <https://github.com/fmtlib/format-benchmark>`_
|
||||||
|
tests compile time and code bloat for nontrivial projects.
|
||||||
|
It generates 100 translation units and uses ``printf()`` or its alternative
|
||||||
|
five times in each to simulate a medium sized project. The resulting
|
||||||
|
executable size and compile time (Apple LLVM version 8.1.0 (clang-802.0.42),
|
||||||
|
macOS Sierra, best of three) is shown in the following tables.
|
||||||
|
|
||||||
|
**Optimized build (-O3)**
|
||||||
|
|
||||||
|
============= =============== ==================== ==================
|
||||||
|
Method Compile Time, s Executable size, KiB Stripped size, KiB
|
||||||
|
============= =============== ==================== ==================
|
||||||
|
printf 2.6 29 26
|
||||||
|
printf+string 16.4 29 26
|
||||||
|
iostreams 31.1 59 55
|
||||||
|
{fmt} 19.0 37 34
|
||||||
|
tinyformat 44.0 103 97
|
||||||
|
Boost Format 91.9 226 203
|
||||||
|
Folly Format 115.7 101 88
|
||||||
|
============= =============== ==================== ==================
|
||||||
|
|
||||||
|
As you can see, {fmt} has 60% less overhead in terms of resulting binary code
|
||||||
|
size compared to iostreams and comes pretty close to ``printf``. Boost Format
|
||||||
|
and Folly Format have the largest overheads.
|
||||||
|
|
||||||
|
``printf+string`` is the same as ``printf`` but with extra ``<string>``
|
||||||
|
include to measure the overhead of the latter.
|
||||||
|
|
||||||
|
**Non-optimized build**
|
||||||
|
|
||||||
|
============= =============== ==================== ==================
|
||||||
|
Method Compile Time, s Executable size, KiB Stripped size, KiB
|
||||||
|
============= =============== ==================== ==================
|
||||||
|
printf 2.2 33 30
|
||||||
|
printf+string 16.0 33 30
|
||||||
|
iostreams 28.3 56 52
|
||||||
|
{fmt} 18.2 59 50
|
||||||
|
tinyformat 32.6 88 82
|
||||||
|
Boost Format 54.1 365 303
|
||||||
|
Folly Format 79.9 445 430
|
||||||
|
============= =============== ==================== ==================
|
||||||
|
|
||||||
|
``libc``, ``lib(std)c++`` and ``libfmt`` are all linked as shared libraries to
|
||||||
|
compare formatting function overhead only. Boost Format and tinyformat are
|
||||||
|
header-only libraries so they don't provide any linkage options.
|
||||||
|
|
||||||
|
Running the tests
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Please refer to `Building the library`__ for the instructions on how to build
|
||||||
|
the library and run the unit tests.
|
||||||
|
|
||||||
|
__ http://fmtlib.net/latest/usage.html#building-the-library
|
||||||
|
|
||||||
|
Benchmarks reside in a separate repository,
|
||||||
|
`format-benchmarks <https://github.com/fmtlib/format-benchmark>`_,
|
||||||
|
so to run the benchmarks you first need to clone this repository and
|
||||||
|
generate Makefiles with CMake::
|
||||||
|
|
||||||
|
$ git clone --recursive https://github.com/fmtlib/format-benchmark.git
|
||||||
|
$ cd format-benchmark
|
||||||
|
$ cmake .
|
||||||
|
|
||||||
|
Then you can run the speed test::
|
||||||
|
|
||||||
|
$ make speed-test
|
||||||
|
|
||||||
|
or the bloat test::
|
||||||
|
|
||||||
|
$ make bloat-test
|
||||||
|
|
||||||
Projects using this library
|
Projects using this library
|
||||||
---------------------------
|
---------------------------
|
||||||
|
|
||||||
@ -331,108 +426,6 @@ than ``fmt::format_int`` on Karma's own benchmark,
|
|||||||
see `Fast integer to string conversion in C++
|
see `Fast integer to string conversion in C++
|
||||||
<http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html>`_.
|
<http://zverovich.net/2013/09/07/integer-to-string-conversion-in-cplusplus.html>`_.
|
||||||
|
|
||||||
Benchmarks
|
|
||||||
----------
|
|
||||||
|
|
||||||
Speed tests
|
|
||||||
~~~~~~~~~~~
|
|
||||||
|
|
||||||
================= ============= ===========
|
|
||||||
Library Method Run Time, s
|
|
||||||
================= ============= ===========
|
|
||||||
libc printf 1.01
|
|
||||||
libc++ std::ostream 3.04
|
|
||||||
fmt 1632f72 fmt::print 0.86
|
|
||||||
tinyformat 2.0.1 tfm::printf 3.23
|
|
||||||
Boost Format 1.67 boost::format 7.98
|
|
||||||
Folly Format folly::format 2.23
|
|
||||||
================= ============= ===========
|
|
||||||
|
|
||||||
{fmt} is the fastest of the benchmarked methods, ~17% faster than ``printf``.
|
|
||||||
|
|
||||||
The above results were generated by building ``tinyformat_test.cpp`` on macOS
|
|
||||||
10.14.3 with ``clang++ -O3 -DSPEED_TEST -DHAVE_FORMAT``, and taking the best of
|
|
||||||
three runs. In the test, the format string ``"%0.10f:%04d:%+g:%s:%p:%c:%%\n"``
|
|
||||||
or equivalent is filled 2,000,000 times with output sent to ``/dev/null``; for
|
|
||||||
further details refer to the `source
|
|
||||||
<https://github.com/fmtlib/format-benchmark/blob/master/tinyformat_test.cpp>`_.
|
|
||||||
|
|
||||||
Compile time and code bloat
|
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
The script `bloat-test.py
|
|
||||||
<https://github.com/fmtlib/format-benchmark/blob/master/bloat-test.py>`_
|
|
||||||
from `format-benchmark <https://github.com/fmtlib/format-benchmark>`_
|
|
||||||
tests compile time and code bloat for nontrivial projects.
|
|
||||||
It generates 100 translation units and uses ``printf()`` or its alternative
|
|
||||||
five times in each to simulate a medium sized project. The resulting
|
|
||||||
executable size and compile time (Apple LLVM version 8.1.0 (clang-802.0.42),
|
|
||||||
macOS Sierra, best of three) is shown in the following tables.
|
|
||||||
|
|
||||||
**Optimized build (-O3)**
|
|
||||||
|
|
||||||
============= =============== ==================== ==================
|
|
||||||
Method Compile Time, s Executable size, KiB Stripped size, KiB
|
|
||||||
============= =============== ==================== ==================
|
|
||||||
printf 2.6 29 26
|
|
||||||
printf+string 16.4 29 26
|
|
||||||
iostreams 31.1 59 55
|
|
||||||
{fmt} 19.0 37 34
|
|
||||||
tinyformat 44.0 103 97
|
|
||||||
Boost Format 91.9 226 203
|
|
||||||
Folly Format 115.7 101 88
|
|
||||||
============= =============== ==================== ==================
|
|
||||||
|
|
||||||
As you can see, {fmt} has 60% less overhead in terms of resulting binary code
|
|
||||||
size compared to iostreams and comes pretty close to ``printf``. Boost Format
|
|
||||||
and Folly Format have the largest overheads.
|
|
||||||
|
|
||||||
``printf+string`` is the same as ``printf`` but with extra ``<string>``
|
|
||||||
include to measure the overhead of the latter.
|
|
||||||
|
|
||||||
**Non-optimized build**
|
|
||||||
|
|
||||||
============= =============== ==================== ==================
|
|
||||||
Method Compile Time, s Executable size, KiB Stripped size, KiB
|
|
||||||
============= =============== ==================== ==================
|
|
||||||
printf 2.2 33 30
|
|
||||||
printf+string 16.0 33 30
|
|
||||||
iostreams 28.3 56 52
|
|
||||||
{fmt} 18.2 59 50
|
|
||||||
tinyformat 32.6 88 82
|
|
||||||
Boost Format 54.1 365 303
|
|
||||||
Folly Format 79.9 445 430
|
|
||||||
============= =============== ==================== ==================
|
|
||||||
|
|
||||||
``libc``, ``lib(std)c++`` and ``libfmt`` are all linked as shared libraries to
|
|
||||||
compare formatting function overhead only. Boost Format and tinyformat are
|
|
||||||
header-only libraries so they don't provide any linkage options.
|
|
||||||
|
|
||||||
Running the tests
|
|
||||||
~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
Please refer to `Building the library`__ for the instructions on how to build
|
|
||||||
the library and run the unit tests.
|
|
||||||
|
|
||||||
__ http://fmtlib.net/latest/usage.html#building-the-library
|
|
||||||
|
|
||||||
Benchmarks reside in a separate repository,
|
|
||||||
`format-benchmarks <https://github.com/fmtlib/format-benchmark>`_,
|
|
||||||
so to run the benchmarks you first need to clone this repository and
|
|
||||||
generate Makefiles with CMake::
|
|
||||||
|
|
||||||
$ git clone --recursive https://github.com/fmtlib/format-benchmark.git
|
|
||||||
$ cd format-benchmark
|
|
||||||
$ cmake .
|
|
||||||
|
|
||||||
Then you can run the speed test::
|
|
||||||
|
|
||||||
$ make speed-test
|
|
||||||
|
|
||||||
or the bloat test::
|
|
||||||
|
|
||||||
$ make bloat-test
|
|
||||||
|
|
||||||
FAQ
|
FAQ
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -459,7 +452,7 @@ A: use ``std::tuple``:
|
|||||||
License
|
License
|
||||||
-------
|
-------
|
||||||
|
|
||||||
fmt is distributed under the BSD `license
|
{fmt} is distributed under the BSD `license
|
||||||
<https://github.com/fmtlib/fmt/blob/master/LICENSE.rst>`_.
|
<https://github.com/fmtlib/fmt/blob/master/LICENSE.rst>`_.
|
||||||
|
|
||||||
The `Format String Syntax
|
The `Format String Syntax
|
||||||
@ -475,7 +468,7 @@ It only applies if you distribute the documentation of fmt.
|
|||||||
Acknowledgments
|
Acknowledgments
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
The fmt library is maintained by Victor Zverovich (`vitaut
|
The {fmt} library is maintained by Victor Zverovich (`vitaut
|
||||||
<https://github.com/vitaut>`_) and Jonathan Müller (`foonathan
|
<https://github.com/vitaut>`_) and Jonathan Müller (`foonathan
|
||||||
<https://github.com/foonathan>`_) with contributions from many other people.
|
<https://github.com/foonathan>`_) with contributions from many other people.
|
||||||
See `Contributors <https://github.com/fmtlib/fmt/graphs/contributors>`_ and
|
See `Contributors <https://github.com/fmtlib/fmt/graphs/contributors>`_ and
|
||||||
|
Reference in New Issue
Block a user