3

我有一个 C++ 代码,我正在玩 Intel 的 VTune,我运行了General Exploration 分析,但不知道如何解释结果。它将Retire Stalls的数量标记为问题。

就其本身而言,这足以让我感到困惑,因为我可能已经不知所措了。但是它列出的具有异常数量的退休摊位的功能是_int_mallocmalloc_consolidate,两者都在libc. 因此,这甚至不是我可以查看自己的代码并试图弄清楚的事情,也不是我真正可以开始改变的事情。

有没有办法使用这些信息来改进我自己的代码?或者这真的只是意味着我应该找到减少或减少分配频率的方法吗?

(注意:手头的特定代码不是问题,我正在寻找策略来解释数据并在热点或停顿或任何“问题”可能出现在我无法控制的代码中时进行改进)

4

2 回答 2

5

有没有办法使用这些信息来改进我自己的代码?或者这真的只是意味着我应该找到减少或减少分配频率的方法吗?

的,听起来您应该对代码进行更改,以减少调用 malloc 的频率。

  • 堆分配真的有必要吗?

  • 是否有可以重复使用的缓冲区?

  • 使用内存池是一种选择吗?

  • 你可以做堆栈分配吗?例如,如果这些是数组,您是否碰巧在编译时知道这些数组的最大大小?

根据您的应用程序,内存分配可能很昂贵。我曾经通过从紧密循环中删除内存分配使程序速度提高了 20 倍。该应用程序在 Linux 上并没有那么慢,但在 Windows 上却是一场灾难。经过我的更改,在 Windows 上也可以。

于 2014-02-25T00:09:24.687 回答
2
  • 知道哪一行代码主要调用 malloc
  • 避免重复分配和释放
  • 可能将 thread-local-storage 与前一点一起使用
  • 编写你自己的分配器,它只在你告诉他时返回内存,否则将释放的内存块保留在列表中(使用 list::splice 将列表元素从一个列表移动到另一个列表)
  • 使用 boost 中的分配器,它可能会像上一点一样做同样的事情
于 2014-02-25T01:45:17.263 回答