开源 企业版 高校版 私有云 模力方舟 AI 队友
代码拉取完成,页面将自动刷新
捐赠
捐赠前请先登录
扫描微信二维码支付
取消
支付完成
支付提示
将跳转至支付宝完成支付
确定
取消
1 Star 0 Fork 0

lee/fmt

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
已有帐号? 立即登录
master
分支 (3)
标签 (35)
master
4.x
text
7.1.3
7.1.2
7.1.1
7.1.0
7.0.3
7.0.2
7.0.1
7.0.0
6.2.1
6.2.0
6.1.2
6.1.1
6.1.0
6.0.0
5.3.0
5.2.1
5.2.0
5.1.0
5.0.0
4.1.0
克隆/下载
克隆/下载
提示
下载代码请复制以下命令到终端执行
为确保你提交的代码身份被 Gitee 正确识别,请执行以下命令完成配置
初次使用 SSH 协议进行代码克隆、推送等操作时,需按下述提示完成 SSH 配置
1 生成 RSA 密钥
2 获取 RSA 公钥内容,并配置到 SSH公钥
在 Gitee 上使用 SVN,请访问 使用指南
使用 HTTPS 协议时,命令行会出现如下账号密码验证步骤。基于安全考虑,Gitee 建议 配置并使用私人令牌 替代登录密码进行克隆、推送等操作
Username for 'https://gitee.com': userName
Password for 'https://userName@gitee.com': # 私人令牌
贡献代码
同步代码
对比差异 通过 Pull Request 同步
同步更新到分支
通过 Pull Request 同步
将会在向当前分支创建一个 Pull
Request,合入后将完成同步
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
未知许可证

{fmt}

https://ci.appveyor.com/api/projects/status/ehjkiefde6gucy1v Ask questions at StackOverflow with the tag fmt

{fmt} is an open-source formatting library providing a fast and safe alternative to C stdio and C++ iostreams.

If you like this project, please consider donating to BY_Help, an initiative to help victims of political repressions in Belarus: Documentation

Q&A: ask questions on Compiler Explorer.

Features

  • Simple C++20 std::format
  • format
  • Fast IEEE 754 floating-point formatter with correct rounding, shortness and round-trip guarantees
  • Safe support for user-defined types
  • High performance: faster than common standard library implementations of (s)printf, iostreams, to_string and to_chars, see Speed tests and Compile time and code bloat
  • Reliability: the library has an extensive set of continuously fuzzed
  • Safety: the library is fully type safe, errors in format strings can be reported at compile time, automatic memory management prevents buffer overflow errors
  • Ease of use: small self-contained code base, no external dependencies, permissive MIT Portability with consistent output across platforms and support for older compilers
  • Clean warning-free codebase even on high warning levels such as -Wall -Wextra -pedantic
  • Locale-independence by default
  • Optional header-only configuration enabled with the FMT_HEADER_ONLY macro

See the Examples

Print to stdout ( #include <fmt/core.h> int main() { fmt::print("Hello, world!\n"); }

Format a string ( std::string s = fmt::format("The answer is {}.", 42); // s == "The answer is 42."

Format a string using positional arguments ( std::string s = fmt::format("I'd rather be {1} than {0}.", "right", "happy"); // s == "I'd rather be happy than right."

Print chrono durations ( #include <fmt/chrono.h> int main() { using namespace std::literals::chrono_literals; fmt::print("Default format: {} {}\n", 42s, 100ms); fmt::print("strftime-like format: {:%H:%M:%S}\n", 3h + 15min + 30s); }

Output:

Default format: 42s 100ms
strftime-like format: 03:15:30

Print a container ( #include <vector> #include <fmt/ranges.h> int main() { std::vector<int> v = {1, 2, 3}; fmt::print("{}\n", v); }

Output:

{1, 2, 3}

Check a format string at compile time

std::string s = fmt::format(FMT_STRING("{:d}"), "I am not a number");

This gives a compile-time error because d is an invalid format specifier for a string.

Write a file from a single thread

#include <fmt/os.h>

int main() {
 auto out = fmt::output_file("guide.txt");
 out.print("Don't {}", "Panic");
}

This can be #include <fmt/color.h> int main() { fmt::print(fg(fmt::color::crimson) | fmt::emphasis::bold, "Hello, {}!\n", "world"); fmt::print(fg(fmt::color::floral_white) | bg(fmt::color::slate_gray) | fmt::emphasis::underline, "Hello, {}!\n", "мир"); fmt::print(fg(fmt::color::steel_blue) | fmt::emphasis::italic, "Hello, {}!\n", "世界"); }

Output on a modern terminal:

https://user-images.githubusercontent.com/576385/88485597-d312f600-cf2b-11ea-9cbe-61f535a86e28.png

Benchmarks

Speed tests

Library Method Run Time, s
libc printf 1.04
libc++ std::ostream 3.05
{fmt} 6.1.1 fmt::print 0.75
Boost Format 1.67 boost::format 7.24
Folly Format folly::format 2.23

{fmt} is the fastest of the benchmarked methods, ~35% faster than printf.

The above results were generated by building tinyformat_test.cpp on macOS 10.14.6 with clang++ -O3 -DNDEBUG -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 dtoa-benchmark) and faster than ryu:

Compile time and code bloat

The script 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
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
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 is a header-only library so it doesn't provide any linkage options.

Running the tests

Please refer to format-benchmarks, 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

  • 2GIS: free business listings with a city map
  • Aseprite: animated sprite editor & pixel art tool
  • Blizzard Battle.net: an online gaming platform
  • Ceph: a scalable distributed storage system
  • ClickHouse: analytical database management system
  • Drake: a planning, control, and analysis toolbox for nonlinear dynamical systems (MIT)
  • FiveM: a modification framework for GTA V
  • HarpyWar/pvpgn: Player vs Player Gaming Network with tweaks
  • Keypirinha: a semantic launcher for Windows
  • Knuth: high-performance Bitcoin full-node
  • MongoDB: distributed document database
  • OpenSpace: an open-source astrovisualization framework
  • PyTorch: an open-source machine learning library
  • Quill: asynchronous low-latency logging library
  • redis-cerberus: a Redis cluster proxy
  • rpclib: a modern C++ msgpack-RPC server and client library
  • Scylla: a Cassandra-compatible NoSQL data store that can handle 1 million transactions per second on a single server
  • spdlog: super fast C++ logging library
  • Touch Surgery: surgery simulator
  • Windows Terminal: the new Windows terminal

email or by submitting an Motivation

So why yet another formatting library?

There are plenty of methods for doing this task, from standard ones like the printf family of function and iostreams to Boost Format and FastFormat libraries. The reason for creating a new library is that every existing solution that I found either had serious issues or didn't provide all the features I needed.

printf

The good thing about printf is that it is pretty fast and readily available being a part of the C standard library. The main drawback is that it doesn't support user-defined types. printf also has safety issues although they are somewhat mitigated with i18n to printf but it is not a part of C99 and may not be available on some platforms.

iostreams

The main issue with iostreams is best illustrated with an example:

std::cout << std::setprecision(2) << std::fixed << 1.23456 << "\n";

which is a lot of typing compared to printf:

printf("%.2f\n", 1.23456);

Matthew Wilson, the author of FastFormat, called this "chevron hell". iostreams don't support positional arguments by design.

The good part is that iostreams support user-defined types and are safe although error handling is awkward.

Boost Format

This is a very powerful library which supports both printf-like format strings and positional arguments. Its main drawback is performance. According to various, benchmarks it is much slower than other methods considered here. Boost Format also has excessive build times and severe code bloat issues (see Benchmarks).

FastFormat

This is an interesting library which is fast, safe and has positional arguments. However, it has significant limitations, citing its author:

Three features that have no hope of being accommodated within the current design are:

  • Leading zeros (or any other non-space padding)
  • Octal/hexadecimal encoding
  • Runtime width/alignment specification

It is also quite big and has a heavy dependency, STLSoft, which might be too restrictive for using it in some projects.

Boost Spirit.Karma

This is not really a formatting library but I decided to include it here for completeness. As iostreams, it suffers from the problem of mixing verbatim text with arguments. The library is pretty fast, but slower on integer formatting than fmt::format_to with format string compilation on Karma's own benchmark, see License

{fmt} is distributed under the MIT Documentation License

The string module documentation. For this reason the documentation is distributed under the Python Software Foundation license available in Maintainers

The {fmt} library is maintained by Victor Zverovich (foonathan) with contributions from many other people. See Releases for some of the names. Let us know if your contribution is not listed or mentioned incorrectly and we'll make it right.

Copyright (c) 2012 - present, Victor Zverovich Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --- Optional exception to the license --- As an exception, if, as a result of your compiling your source code, portions of this Software are embedded into a machine-executable object form of such source code, you may redistribute such embedded portions in such object form without including the above copyright and permission notices.
举报
举报成功
我们将于2个工作日内通过站内信反馈结果给你!
请认真填写举报原因,尽可能描述详细。
请选择举报类型
取消
发送
误判申诉

此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。

如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。

取消
提交

简介

暂无描述
暂无标签
README
未知许可证
查看未知开源许可协议
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
编辑仓库简介
简介内容
主页
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/eeth/fmt.git
git@gitee.com:eeth/fmt.git
eeth
fmt
fmt
master
点此查找更多帮助

搜索帮助

评论
仓库举报
回到顶部
登录提示
该操作需登录 Gitee 帐号,请先登录后再操作。
立即登录
没有帐号,去注册

AltStyle によって変換されたページ (->オリジナル) /