我需要将char*
转换为unsigned long long int
,strtoull()
标准库中有一个名为C
的函数,但需要很长时间。我需要在char*
到unsigned long long int
之间快速转换。如何编写比标准转换函数更快的转换函数?
答案 0 :(得分:4)
我现在能想到的最短/最快的代码:
unsigned long long strtoull_simple(const char *s) {
unsigned long long sum = 0;
while (*s) {
sum = sum*10 + (*s++ - '0');
}
return sum;
}
没有错误检查。配置文件以查找是否可以提高性能。 YMMV。
接受后:尝试将初始计算变为unsigned
的变体,然后继续unsigned long long
。我的64位计算机的边缘到负面改进取决于设置的数量。怀疑在unsigned long long
操作费用昂贵的机器上它会更快。
unsigned long long strtoull_simple2(const char *s) {
unsigned sumu = 0;
while (*s) {
sumu = sumu*10 + (*s++ - '0');
if (sumu >= (UINT_MAX-10)/10) break; // Break if next loop may overflow
}
unsigned long long sum = sumu;
while (*s) {
sum = sum*10 + (*s++ - '0');
}
return sum;
}
如果代码知道字符串的长度,那么以下内容有一些性能改进(5%)
unsigned long long strtoull_2d(const char *s, unsigned len) {
unsigned sumu = 0;
#define INT_MAX_POWER_10 9
if (len > INT_MAX_POWER_10) {
len = INT_MAX_POWER_10;
}
while (len--) {
sumu = sumu * 10 + (*s++ - '0');
}
unsigned long long sum = sumu;
while (*s) {
sum = sum * 10 + (*s++ - '0');
}
return sum;
}
结论:对简单原始解决方案的改进(我试过7)可以产生小的增量速度效率,但它们变得越来越依赖于平台和数据集。建议编程人才更好地应用于更高级别的代码改进。
答案 1 :(得分:1)