【问题标题】:Monitoring for std container resizing监控标准容器大小调整
【发布时间】:2020-03-06 15:14:01
【问题描述】:

我正在开发一个高性能代码库,该代码库由于容器调整大小而遇到一些性能问题。随着时间的推移检查吞吐量或延迟显示了一种模式,其中呈指数增长的延迟峰值与呈指数增长的时间段分开,这表明容器的大小会随着容量的增加而翻倍。

我很难通过手动搜索代码来跟踪哪个容器正在增长,并且希望使用 gdb 跟踪容器预留。

是否可以设置一个断点(或多个断点),以便在容器保留更多空间时 gdb 将停止执行?我不确定容器是矢量、地图还是集合,所以如果这三个容器都依赖于相同的底层调用来调整大小,那可能是最好的。否则,我很乐意设置多个断点。

【问题讨论】:

  • 如果没有其他动态分配,可以在operator new上设置断点。但如果有许多其他与这个问题无关的动态分配,它可能太嘈杂了。
  • 最好的办法是在您知道代码要调整大小时(例如,第一次添加元素时)单步执行代码,当您到达调整大小的代码时添加断点

标签: c++ stl gdb


【解决方案1】:

是否可以设置一个断点(或多个断点),以便在容器保留更多空间时 gdb 将停止执行?

否:vector、map 和 set 不共享一个共同的resize(除了最终都进入::operator new)。

您可以为相当大的大小设置条件::operator new 断点,并查看从哪里调用它。

暗示随着容量的增加,容器的尺寸会增加一倍。

请注意,只有vector 会这样做,因此在std::vector...::_M_allocate(对于libstdc++)上设置断点可能是一个很好的起点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多