【发布时间】:2010-09-11 01:06:36
【问题描述】:
我正在寻找针对美国英语语言环境、ASCII 和非科学符号进行优化的 IA32 上极快的 atof() 实现。 windows 多线程 CRT 在每次调用 isdigit() 时都会检查语言环境的变化,因此在这里很糟糕。我们目前的最佳表现源自 perl + tcl 的 atof 实现中的最佳表现,并且比 msvcrt.dll 的 atof 实现了一个数量级。我想做得更好,但我没有想法。 BCD 相关的 x86 指令看起来很有希望,但我无法让它胜过 perl/tcl C 代码。任何 SO'ers 都可以挖掘到最好的链接吗?也欢迎基于非 x86 汇编的解决方案。
基于初步答案的澄清:
~2 ulp 的误差对于这个应用来说是可以的。
要转换的数字将通过网络以小批量 ascii 消息的形式到达,我们的应用程序需要以尽可能低的延迟进行转换。
【问题讨论】:
-
检查
isdigit上的区域设置更改?也许他们应该了解一下 ISO C 标准。isdigit没有与语言环境相关的行为;它必须检查字符是否是集合0到9的元素,仅此而已。 -
你能给我们一个问题域的想法吗?我猜这不是财务问题,或者您会使用定点算术。是用于控制系统,例如定位吗?你有(硬的或软的)实时要求吗?
-
如果您可以修改消息格式,显然发送二进制浮点数(或更简单的二进制文本编码)将在另一端节省昂贵的解析。例如如果二进制不正确,则将浮点数转储为十六进制整数。
-
github.com/lemire/fast_double_parser (来自仅链接的答案)。 Daniel Lemire 是优化领域的知名人士,因此它的质量可能很好。另见他的相关博文:lemire.me/blog/2020/09/10/…
标签: c++ c performance assembly floating-point