瓶颈和不良样式代码

Bottleneck and bad style code

本文关键字:样式 代码 不良      更新时间:2023-10-16

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

瓶颈是这个功能:

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应该会让百亿倍的速度更快。 如果没有,则类似的东西(开始/结束指针对或开始/长度)。

它写得也很笨拙,但我没有看到任何可怕的表现。

抛出一些对齐/长度保证,你可以 SSE 优化它,但这在用视图替换字符串旁边会很小,而且要困难得多。

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