【问题标题】:Slow down associated with vector::push_back and placement new in a multithreaded application与多线程应用程序中的 vector::push_back 和放置 new 相关的减速
【发布时间】:2025-12-10 10:25:05
【问题描述】:

我有一个多线程应用程序,其中我的线程利用率非常低(在每个线程 1%-4% 的范围内,线程数少于处理器)。在调试器中,它似乎在 vector::push_back 中花费了大量时间,特别是在 push_back 期间发生的新放置。我尝试使用reserve 来避免向量扩展其容量并复制所有内容,但这似乎不是问题。注释掉 vector::push_backs 会导致更好的线程利用率。

这个问题出现在 uint64_t 的向量上,所以它似乎不是复杂对象构造的结果。我尝试过使用标准分配器和自定义分配器,它们的执行方式相同。这些向量正被分配它们的同一线程使用。

【问题讨论】:

  • 您应该添加您正在使用的具体平台/编译器,因为这些类型的与性能相关的问题可能与某些特定的实现有关,而不是与语言本身有关

标签: c++ memory-management


【解决方案1】:

除非您需要将它们初始化为 0,否则请考虑编写一个 初始化的类矢量类。我发现这可以在某些情况下提供可衡量的性能提升。

附注:当您的分析器声称您将大部分时间花在对 64 位整数的原始操作上时,您就知道您的其余代码已经过优化。

【讨论】:

    【解决方案2】:

    也许一些微不足道的东西不会真正起作用,但是当push_back 调用创建一个新项目时,为什么不将向量初始化为全0,并使用atoperator[] 之类的东西访问元素。这应该可以摆脱向量上的任何锁定。

    【讨论】:

      【解决方案3】:

      如果只使用一个线程,线程利用率会提高吗?如果是这样,也许您正在与某种堆锁发生冲突,例如

      In multithreaded C/C++, does malloc/new lock the heap when allocating memory

      http://msdn.microsoft.com/en-us/library/ms810466.aspx

      【讨论】: