• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

向量移动构造函数比复制构造函数要慢

c/c++ 来源:m0meni 3次浏览

我正在处理我的第一个C++项目,它是一个CSV解析器(full source code here)。它正在工作,现在我想要进行基本的重构/提高性能。向量移动构造函数比复制构造函数要慢

目前解析器的工作方式是通过返回每一行作为std::vector<std::string>,我认为,而不是分配一个新的向量和一个新的字符串,每次我只有一个内部向量和内部字符串保留内存我会一再清除。

这工作,我开始寻找其他地方,我可能会做内存分配,我看到这个函数拷贝内部矢量,然后将其清除:

auto add_row() -> std::vector<std::string> { 
    auto row(m_bufvec); 
    m_bufvec.clear(); 
    return row; 
} 

我想,如果我而不是改变了这一行

auto row(m_bufvec); 

auto row(std::move(m_bufvec)); 

它会导致以s因为根据http://en.cppreference.com/w/cpp/container/vector/vector,它需要一定的时间而不是线性的。令我惊讶的是,它使解析器明显变慢(根据我的真实粗糙基准运行time ./main.o而不是this file)。

我完全不熟悉优化,基准测试和调整C++代码所带来的一切。也许这种优化是无用的,即使它的工作,但不管,我很好奇为什么std::move导致放缓。我错过了什么吗?


===========解决方案如下:

复制bufvec时,其容量不变,但移动时容量将被清除。因此,稍后当您填写bufvec时,会进行对数分配以再次扩大其容量,这种分配可能很容易成为您的性能瓶颈。

移动版本使功能更快。但它使其他代码变慢。微型优化不能可靠地使程序更快。


编辑由OP:

通过在m_bufvec.reserve(row.size())移动后的评论Cheers and hth. - Alf提出的解决方案解决了这个问题,并确认上述推理是正确的。此外,它更有效率,(尽管只是略微),因为

你避免复制项目[在bufvec]。如果这些项目是简单的整数值,那并不重要。如果物品是例如字符串,动态分配,那么它确实很重要。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)