我让这个方法从文件中读取并将其放入字符串向量中;
std::vector<std::string> read_file_lines1(const char* filepath){
std::vector<std::string> file;
std::ifstream input(filepath);
Timer timer;
float time = 0;
std::string line;
int i = 0;
while (getline(input, line)){
timer.reset();
file.push_back(line);
time += timer.elapsed();
if (i == 10000)
std::cout << "10000 done" << std::endl;
i = ((i + 1) % 10001);
}
std::cout << time << std::endl;;
return file;
}
但是我认为表现非常糟糕(约22秒内有200k行)
稍微改一下,使它成为vector<string*>
(使用file.push_back(新的std :: string(line))回拨调用从大约16秒到大约1.2秒这是一个巨大的进步(仍然落后于我并且它有一个小缺点:内存使用;如果我想清除这里使用的内存,我将不得不记住要循环清除每个字符串*
现在整个方法需要6~秒,其中约5个主要用于“getline”方法中的字符串,我真的想知道如何优化它或做出替代方法。
PS:我这样做会加载一个3D模型,在Java中使用相同的模型需要大约0.8秒来读取所有内容和过滤器(将“每一行放在”顶点/纹理...数组然后放入它们在索引顺序中),所以我真的很失望,如果我花了那么多时间从c ++中的文件读取每一行(在java / c ++中使用调试模式,这可能使它成为一个非常糟糕的基准但我仍然真的很失望);答案 0 :(得分:2)
它很慢的主要原因是,每次达到矢量容量时,您需要重新分配内存并将所有字符串移动到新位置。使用std::deque而不是vector,deque不会重新分配内存,它会添加新的块。或者您可以使用reserve方法预分配矢量,以避免重新分配。
同样调试c ++代码可能比发布要慢得多,特别是对于大量的模板和/或内联代码 - 你真的需要测量发布性能,你需要使用计时器只需一次整个循环,因为我怀疑在发布时模式,你会花很多时间在计时码。
另一个小优化。而不是
if (i == 10000)
std::cout << "10000 done" << std::endl;
i = ((i + 1) % 10001);
使用:
if (i == 10000)
{
std::cout << "10000 done" << std::endl;
i = 0;
}
++i;