首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化的itoa函数

优化的itoa函数
EN

Stack Overflow用户
提问于 2011-10-25 21:43:02
回答 7查看 14.6K关注 0票数 17

我正在考虑如何使用SSE指令实现整数(4字节,无符号)到字符串的转换。通常的例程是除以数字并将其存储在局部变量中,然后对字符串进行反转(本例中缺少反转例程):

代码语言:javascript
复制
char *convert(unsigned int num, int base) {
    static char buff[33];  

    char *ptr;    
    ptr = &buff[sizeof(buff) - 1];    
    *ptr = '\0';

    do {
        *--ptr="0123456789abcdef"[num%base];
        num /= base;
    } while(num != 0);

    return ptr;
}

但是反转需要额外的时间。除了SSE指令之外,是否还有其他算法可以用来并行化函数?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2011-10-25 23:41:48

优化代码的第一步是摆脱任意的基础支持。这是因为除以常量几乎肯定是乘法,但除以base是除法,而且因为'0'+n"0123456789abcdef"[n]快(前者不涉及内存)。

如果你需要更进一步,你可以为你关心的基数中的每个字节制作查找表(例如10),然后向量相加每个字节的结果(例如十进制)。如下所示:

代码语言:javascript
复制
00 02 00 80 (input)

 0000000000 (place3[0x00])
+0000131072 (place2[0x02])
+0000000000 (place1[0x00])
+0000000128 (place0[0x80])
 ==========
 0000131200 (result)
票数 9
EN

Stack Overflow用户

发布于 2013-09-10 00:19:38

This post比较了几种整数到字符串转换的方法,也就是itoa。据报道,最快的方法是来自the {fmt} libraryfmt::format_int,它比sprintf/std::stringstream快5-18倍,比简单的ltoa/itoa实现快约4倍(当然,实际数字可能会因平台而异)。

与大多数其他方法不同,fmt::format_int只传递一次数字。它还使用Alexandrescu的talk Fastware中的想法最小化整数除法的数量。这个实现可以在here上找到。

当然,如果C++是一个选项,并且您不受itoa的API的限制,则可以这样做。

免责声明:我是这个方法和fmt library的作者。

票数 5
EN

Stack Overflow用户

发布于 2011-12-12 19:13:55

http://sourceforge.net/projects/itoa/

它使用一个包含所有4位整数的大型静态常量数组,并将其用于32位或64位到字符串的转换。

可移植,不需要特定的指令集。

我能找到的唯一更快的版本是汇编代码,并且被限制为32位。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7890194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档