C++ 最快的数字字符串到长解析

C++ Fastest numerical string to long parsing

这是我的想法。

我不是 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;
};

老实说,在您的情况下,我相信您不会看到巨大的好处,因为循环体不是那么小。这在很大程度上取决于系统并且需要实验(就像大多数优化一样)。 好的编译器优化器可能会自动展开循环,如果它确实有益的话。

但值得一试。