在C中有替代strtoull()函数吗?

我需要将char*转换为unsigned long long int并且在C标准库中有一个名为strtoull()的函数,但它需要很长时间。 我需要在char*unsigned long long int之间快速转换。 如何编写比标准转换function更快的转换function?

我能想到的最短/最快的代码:

 unsigned long long strtoull_simple(const char *s) { unsigned long long sum = 0; while (*s) { sum = sum*10 + (*s++ - '0'); } return sum; } 

没有错误检查。 配置文件以查找是否可以提高性能。 因人而异。


接受后:尝试将初始计算中的变量设置为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)可以产生小的增量速度效率,但它们变得越来越依赖于平台和数据集。 建议编程人才更好地应用于更高级别的代码改进。

从@ soerium修改为使用unsigned long long 答案比strtoull()提供更好的性能。

 unsigned long long fast_atoull(const char *str) { unsigned long long val = 0; while(*str) { val = (val << 1) + (val << 3) + (*(str++) - 48); } return val; }