瓶颈和糟糕的风格代码

Bottleneck and bad style code

我写了一个程序,但遇到了性能问题。

瓶颈是这个功能:

void getlinesplit(const char *file, unsigned int &pos, tline &vline)
{
    vline.clear();

    unsigned int debut_du_mot = 0;
    unsigned int i = 0;
    while (file[pos+i] != '\n')
    {
        if (file[pos+i] == '\t')
        {
            vline.push_back(std::string(file+pos+debut_du_mot,i - debut_du_mot));
            debut_du_mot = i+1;
        }
        ++i;
    }
    vline.push_back(std::string(file+pos+debut_du_mot,i - debut_du_mot));
    pos = pos + i+1;
}

这个函数被调用了 11 988 400 次。

vline是同一个字符串向量,避免创建和销毁一个向量。

如何改进此功能?

PS: 该行最多由1或2个字组成。

很可能函数不是瓶颈,而是您调用它 1200 万次的事实:-)

一个明显的改进是有一个变量

const char* file_pos = file + pos;

简化每一次访问。您没有说 tline 是如何实现的;如果一行从不包含超过两个单词,那么您可以通过使用两个 std::string 成员而不是数组来使其更快。

来自 C++17 的

std::experimental::string_view 如果可访问的话应该会使速度快上千万倍。如果不是,类似的东西(begin/end 指针对或 start/length)。

它也写得很笨拙,但我没有看到任何糟糕的性能。

加入一些 alignment/length 保证,您可以通过 SSE 对其进行优化,但与用视图替换字符串相比,这将是微不足道的,而且难度更大。

任何好处都可能是有限的,因为情况可能受 io 限制。获得更快的磁盘。