我写了一个程序,但我遇到了性能问题。
瓶颈就是这个功能:
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个单词组成。
答案 0 :(得分:1)
最有可能的功能不是瓶颈,而是你称它为1200万次: - )
明显的改进是变量
const char* file_pos = file + pos;
简化每一次访问。你不会说tline是如何实现的;如果一行永远不会包含两个以上的单词,那么你可以通过使用两个std :: string成员而不是数组来加快它。
答案 1 :(得分:0)
std::experimental::string_view
如果可访问的话应该会快几百倍。如果不是,类似的东西(开始/结束指针对或开始/长度)。
它写得也很笨拙,但我没有看到任何可怕的表现。
抛出一些对齐/长度保证,你可以SSE对它进行优化,但是在用视图替换字符串旁边会很小,而且更难。
任何好处都可能受到限制,因为情况可能是受限制的。获得更快的磁盘。