我正在通过以下方式处理非常大的文本文件:
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
vector 中的malloc / free(new [] / delete [])操作。我意识到set
vector 中的字符串仍然可以动态分配内存。但是结果到了83分钟。
请注意,除了在“类”级别上移动
set
和buffer
之外,我什么都不会更改。我只在processLine_
方法中使用它们。这是为什么?
引用地点?
我想到的唯一解释是一些字符串足够小并且适合SSO,但这听起来不太可能。
在-O3中使用clang
最佳答案
我进行了简要介绍,发现大部分时间都花在了第三方C库中。
我以为这个库很快,但是事实并非如此。
我仍然对减速感到困惑,但是即使我对其进行了优化,也不会带来太大的改变。
关于c++ - std::vector和std::string的性能下降令人惊讶,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62089016/