C++ 最快的数字字符串到长解析
C++ Fastest numerical string to long parsing
这是我的想法。
len
保证具有有意义的值(char 数组的正数和真实大小)
s
是长无符号数,作为没有空终止的字符串(从第 3 方库接收)通常为 11-12 个符号,例如“123456789000”
- 运行 x86 linux
我不是 C++ 开发人员,你能帮助让它更快吗?
inline uint64_t strtol(char* s, int len)
{
uint64_t val = 0;
for (int i = 0; i < len; i++)
{
char c = *(s + i) - '0';
val = val * 10 + c;
}
return val;
};
您可能想看看循环展开。
当循环体足够短时,每次迭代检查循环条件可能会相对昂贵。
实现循环展开的一种具体而有趣的方法称为 Duff 的设备:https://en.wikipedia.org/wiki/Duff%27s_device
这是您的函数的版本:
inline uint64_t strtol_duff(char* s, int len)
{
uint64_t val = 0;
int n = (len + 7) / 8;
int i = 0;
switch (len % 8) {
case 0: do {
val = val * 10 + (*(s + i++) - '0');
case 7: val = val * 10 + (*(s + i++) - '0');
case 6: val = val * 10 + (*(s + i++) - '0');
case 5: val = val * 10 + (*(s + i++) - '0');
case 4: val = val * 10 + (*(s + i++) - '0');
case 3: val = val * 10 + (*(s + i++) - '0');
case 2: val = val * 10 + (*(s + i++) - '0');
case 1: val = val * 10 + (*(s + i++) - '0');
} while (--n > 0);
}
return val;
};
老实说,在您的情况下,我相信您不会看到巨大的好处,因为循环体不是那么小。这在很大程度上取决于系统并且需要实验(就像大多数优化一样)。
好的编译器优化器可能会自动展开循环,如果它确实有益的话。
但值得一试。
这是我的想法。
len
保证具有有意义的值(char 数组的正数和真实大小)s
是长无符号数,作为没有空终止的字符串(从第 3 方库接收)通常为 11-12 个符号,例如“123456789000”- 运行 x86 linux
我不是 C++ 开发人员,你能帮助让它更快吗?
inline uint64_t strtol(char* s, int len)
{
uint64_t val = 0;
for (int i = 0; i < len; i++)
{
char c = *(s + i) - '0';
val = val * 10 + c;
}
return val;
};
您可能想看看循环展开。 当循环体足够短时,每次迭代检查循环条件可能会相对昂贵。
实现循环展开的一种具体而有趣的方法称为 Duff 的设备:https://en.wikipedia.org/wiki/Duff%27s_device
这是您的函数的版本:
inline uint64_t strtol_duff(char* s, int len)
{
uint64_t val = 0;
int n = (len + 7) / 8;
int i = 0;
switch (len % 8) {
case 0: do {
val = val * 10 + (*(s + i++) - '0');
case 7: val = val * 10 + (*(s + i++) - '0');
case 6: val = val * 10 + (*(s + i++) - '0');
case 5: val = val * 10 + (*(s + i++) - '0');
case 4: val = val * 10 + (*(s + i++) - '0');
case 3: val = val * 10 + (*(s + i++) - '0');
case 2: val = val * 10 + (*(s + i++) - '0');
case 1: val = val * 10 + (*(s + i++) - '0');
} while (--n > 0);
}
return val;
};
老实说,在您的情况下,我相信您不会看到巨大的好处,因为循环体不是那么小。这在很大程度上取决于系统并且需要实验(就像大多数优化一样)。 好的编译器优化器可能会自动展开循环,如果它确实有益的话。
但值得一试。