m0m*_*eni 5 c++ csv vector move-semantics c++11
我正在开发我的第一个C++项目,这是一个CSV解析器(这里是完整的源代码).它正处于工作状态,现在我想进行基本的重构/提高性能.
目前解析器工作的方式是将每一行作为a返回std::vector<std::string>,并且我认为每次我只有一个内部向量和内部字符串以及保留的内存时我不再分配新的向量和新的字符串.然后再次.
这很有用,我开始查看我可能正在进行内存分配的其他地方,我看到了这个复制内部向量的函数,然后清除它:
auto add_row() -> std::vector<std::string> {
auto row(m_bufvec);
m_bufvec.clear();
return row;
}
Run Code Online (Sandbox Code Playgroud)
我想如果我改变了这条线
auto row(m_bufvec);
Run Code Online (Sandbox Code Playgroud)
至
auto row(std::move(m_bufvec));
Run Code Online (Sandbox Code Playgroud)
它会带来某种速度提升,因为根据http://en.cppreference.com/w/cpp/container/vector/vector,它需要恒定的时间而不是线性的.令我惊讶的是,它显著慢(根据我跑真的粗略的基准作出的解析器time ./main.o过这个文件).
我完全不熟悉优化,基准测试以及调优C++代码所带来的所有其他功能.也许这种优化即使有效也没用,但无论如何,我很好奇为什么std::move会导致经济放缓.我错过了什么吗?
复制bufvec时,其容量不变,但移动时,其容量将被清除.因此,稍后当您填写bufvec时,会进行对数的分配以再次扩展其容量,这样的分配很容易成为您的性能瓶颈.
移动版本使该功能更快.但它使其他代码变慢.微优化不能可靠地使程序更快.
由OP编辑:
移动后Cheers and hth. - Alf的评论中提出的解决方案m_bufvec.reserve(row.size())解决了问题,并确认上述推理是正确的.此外,它更有效,(虽然只是略微),因为
你避免复制[bufvec]中的项目.如果项是简单的整数值,那么这并不重要.如果项目是例如字符串,具有动态分配,那么它确实很重要.