c++ 将文件行读取到矢量<string>

c++ Read File lines to vector<string>

本文关键字:lt string gt 文件 读取 c++      更新时间:2023-10-16

我使用这个方法从文件中读取并将其放入字符串向量中;

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;