linux C++最快的数字字符串长解析[重复]

f8rj6qna  于 2023-11-17  发布在  Linux
关注(0)|答案(1)|浏览(120)

此问题在此处已有答案

Most insanely fast way to convert 9 char digits into an int or unsigned int(3个答案)
去年关闭。
这是我的想法

  • len保证具有有意义的值(char数组的正和真实大小)
  • s是一个长的无符号数字,作为一个字符串,没有空终止(从第三方lib接收),通常有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;
     };

字符串

lh80um4z

lh80um4z1#

你可能想看看循环展开。当循环体足够短时,每次迭代检查循环条件可能相对昂贵。
实现循环展开的一种特殊而有趣的方法称为Duff's 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;
};

字符串
老实说,在你的情况下,我相信你不会看到很大的好处,因为循环的主体并不那么小。它非常依赖于系统,需要实验(像大多数优化一样)。好的编译器优化器可能会自动展开循环,如果它真的有用的话。
但值得一试。

相关问题