c++ 将文件行读取到矢量<string>
c++ Read File lines to vector<string>
我使用这个方法从文件中读取并将其放入字符串向量中;
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;
}
但是在我看来,性能真的很差(20万行在22秒内)
的一个小的改变,使其成为一个vector<string*>
(使用文件)。Push_back (new std::string(line)) Push_back调用从~16秒减少到~1.2秒,这是一个巨大的改进(仍然落后于我的目标),它有一个小缺点:内存使用;如果我想清除这里使用的内存,我必须记住创建一个循环来清除每个字符串*
现在整个方法需要6~秒,其中5 ~秒主要用于字符串中的"getline"方法,我真的很想知道如何优化它或做出替代。
PS:我这样做是加载一个3D模型,在Java中使用相同的模型,它需要~0.8秒来读取所有内容和过滤器(将"每一行"放入顶点/纹理…数组,然后按索引顺序排列),所以如果我花那么多时间从c++文件中读取每一行,我真的很失望(在java/c++中使用调试模式,这可能会使它成为一个很糟糕的基准测试,但我仍然很失望);慢的主要原因是每次到达向量容量时需要重新分配内存并将所有字符串移动到新的位置。使用std::deque代替vector, deque不会重新分配内存,它会添加新的块。或者您可以使用reserve方法预先分配vector,以避免重新分配。
而且调试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;
相关文章:
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 呼叫运营商<<临时
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 为std::string的某个索引赋值
- <<操作员在下面的行中工作
- std中有类似find_last_of的函数,而string中没有
- 使用 std::string () const 函数启动线程或未来
- 使用char类型将decimal转换为string,将string转换为decimal
- 迭代和比较映射<字符串、矢量<string>> c++ 中的值
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 将向量解析<string>为字符串
- 'string.assign(string.data(), 5)' 是明确定义的还是 UB?
- 如何更改大小(std::string)
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- std::string 的对象真的可以移动吗?
- 与'operator='不匹配(操作数类型'String'且"void")
- SegFault 同时使用 std::string::operator+= 和函数作为参数