繁体   English   中英

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

[英]Surprising performance degradation with std::vector and std::string

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

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向量中的 malloc / free (new[] / delete[]) 操作。 我意识到set向量内的字符串仍然动态分配 memory。

然而结果到了 83 分钟。

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

这是为什么? 参考地点?

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

将 clang 与 -O3 一起使用

我做了配置文件,发现大部分时间都花在了第三方 C 库中。

我认为这个库非常快,但事实并非如此。

我仍然对减速感到困惑,但即使我对其进行优化,也不会产生如此大的影响。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM