[英]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();
}
我希望这会减少buffer
和set
向量中的 malloc / free (new[] / delete[]) 操作。 我意识到set
向量内的字符串仍然动态分配 memory。
然而结果到了 83 分钟。
请注意,除了在“类”级别上移动set
和buffer
之外,我不会更改任何内容。 我只在processLine_
方法中使用它们。
这是为什么? 参考地点?
我想到的唯一解释是一些足够小并适合 SSO 的字符串,但这听起来不太可能。
将 clang 与 -O3 一起使用
我做了配置文件,发现大部分时间都花在了第三方 C 库中。
我认为这个库非常快,但事实并非如此。
我仍然对减速感到困惑,但即使我对其进行优化,也不会产生如此大的影响。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.