c++ - std::vector和std::string的性能下降令人惊讶

标签 c++ string vector

我正在通过以下方式处理非常大的文本文件:

class Loader{
    template<class READER>
    bool loadFile(READER &reader){
        /* for each line of the input file */ {
            processLine_(line);
        }
    }

    bool processLine_(std::string_view line){
        std::vector<std::string> set; // <-- here
        std::string buffer;           // <-- here

        // I can not do set.reserve(),
        // because I have no idea how much items I will put.

        // do something...
    }

    void printResult(){
        // print aggregated result
    }
}

处理143,000,000条记录大约需要68分钟。

因此,我决定对一些std::array缓冲区进行一些非常棘手的优化。结果约为62分钟。
但是代码变得非常不可读,因此我决定在生产中不使用它们。

然后我决定进行部分优化,例如
class Loader{
    template<class READER>
    bool loadFile(READER &reader);

    std::vector<std::string> set; // <-- here
    std::string buffer;           // <-- here

    bool processLine_(std::string_view line){
        set.clear();

        // do something...
    }

    void printResult();
}

我希望这会减少bufferset vector 中的malloc / free(new [] / delete [])操作。我意识到set vector 中的字符串仍然可以动态分配内存。

但是结果到了83分钟。

请注意,除了在“类”级别上移动setbuffer之外,我什么都不会更改。我只在processLine_方法中使用它们。

这是为什么?
引用地点?

我想到的唯一解释是一些字符串足够小并且适合SSO,但这听起来不太可能。

在-O3中使用clang

最佳答案

我进行了简要介绍,发现大部分时间都花在了第三方C库中。

我以为这个库很快,但是事实并非如此。

我仍然对减速感到困惑,但是即使我对其进行了优化,也不会带来太大的改变。

关于c++ - std::vector和std::string的性能下降令人惊讶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62089016/

相关文章:

c++ - 模板类前向声明

c++ - 共享库中的回溯函数

Windows (x86) 程序集将空终止符 append 到输入的字符串

带有对象指针的 C++ vector

c# - C# 的 TripleDES IV?

c++ - 定义用于 volatile 和非 volatile 对象的例程

C++ 构造函数错误

.net - 当在 VB.net 中的字符串中使用时,像 {} 这样的括号是什么意思?我在哪里可以找到详细信息?

string - 从R中的字符串中删除html标签

c++ - 方便地将 std::vector<unsigned char> 复制到输入流 (std::istream) 对象