[discuss; enhancement] faster f32toa/f64toa algorithm
Author: xjb714Created Feb 6, 2026Updated Jul 8, 2026
字节跳动各位工程师:
您好!
讨论针对浮点数打印算法的优化,即对 f64toa.c 和 f32toa.c 进行优化说明。
项目信息
- C++ 实现仓库:https://github.com/xjb714/xjb
- 核心实现(单文件):https://github.com/xjb714/xjb/blob/main/src/ftoa.cpp
- 示例代码:https://github.com/xjb714/xjb/blob/main/example/example.cpp
- 算法原理文档:https://github.com/xjb714/xjb/blob/main/xjb.pdf
技术背景
最优浮点数打印算法遵循 Steele & White 算法。当前主流高性能算法包括 Ryu、Schubfach、Dragonbox、YY、ZMIJ 等。本算法基于 Schubfach 算法进行深度优化。
核心优化点
- 边界值判断优化:采用更高效的边界值判断算法,显著减少乘法运算次数
- 指令级并行优化:减少指令依赖,提升 IPC(每周期指令数)
- 指令数量优化:精简指令数量,降低指令缓存占用
- 分支预测优化:减少分支数量,优化分支预测逻辑,降低分支预测失败率
- SIMD 指令加速:
- ARM64:采用 NEON 指令集
- x64:采用 AVX512IFMA、SSE4.1、SSE2 指令集
测试验证
- f32 类型:已通过穷举测试
- f64 类型:已通过随机数测试
当前状态
目前实现尚未完全符合 JSON 标准( https://tc39.es/ecma262/#sec-numeric-types-number-tostring )。后续计划优化代码以符合 JSON 标准,预计需要一定时间。
结语
欢迎各位工程师 review 代码,期待交流与合作!
Source: bytedance/sonic