瓶颈和坏样式代码

时间:2016-07-17 13:19:49

标签: c++ optimization mmap

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

瓶颈就是这个功能:

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个单词组成。

2 个答案:

答案 0 :(得分:1)

最有可能的功能不是瓶颈,而是你称它为1200万次: - )

明显的改进是变量

const char* file_pos = file + pos;

简化每一次访问。你不会说tline是如何实现的;如果一行永远不会包含两个以上的单词,那么你可以通过使用两个std :: string成员而不是数组来加快它。

答案 1 :(得分:0)

来自C ++ 17的

std::experimental::string_view如果可访问的话应该会快几百倍。如果不是,类似的东西(开始/结束指针对或开始/长度)。

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

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

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