我试图在C语言中优化字符串到uint64值的解析。目前我使用一个简单的解决方案:
uint64_t parse(const char *source)
{
uint64_t res = 0;
while (source[0] >= '0' && source[0] <= '9') {
res = res * 10 + (source[0] - '0');
++source;
}
return res;
}
然而,这并不是那么快,我的第一次优化实际上是通过一个简单的比较来替换isdigit(c)
(由于isdigit
的实现,这要快得多),不幸的是,这也是我的最后一次优化。
有一些帖子描述了一些小魔术,但他们似乎总是假设固定大小的整数:https://kholdstare.github.io/technical/2020/05/26/faster-integer-parsing.html
有什么技巧可以让整数解析在整数长度未知的情况下也更快吗?
谢谢
3条答案
按热度按时间hpcdzsge1#
测试了三种不同的实现:
手动展开比OP的循环版本稍快。
结果(1000000000次迭代-20个字符长的数字):
l7wslrjt2#
第一步,可以将
*source
强制转换为unsigned char
。减去“0”后,只需执行一次比较。如果可用,您还可以使用
[[likely]]
影响分支预测(* 在本例中没有任何影响 *)如果你事先知道字符串的长度,那么一次获取和处理多个字节是可能的。
演示-https://godbolt.org/z/5q15P5611
mzillmmw3#
下面是OP函数的一个小小的改进。它不需要源代码至少是20字节,不像展开的版本。
我有结果了...
以及