【问题标题】:How to measure the time spent managing memory如何衡量管理内存所花费的时间
【发布时间】:2013-02-24 09:55:50
【问题描述】:

reddit thread 引起了我对自定义内存分配器的注意。例如,用户 Rohmboid 说:

如果有的话,人们就不会编写自己的池分配器了 没有明显的好处。

他们怎么知道有一个?

如果花在管理内存上的时间只占程序持续时间的不到 1%,我不想浪费我的时间/金钱/精力来编写自定义分配器。我也不想切换到自定义分配器并且无法判断加速。所以我想知道:我如何衡量(或至少估计)分配/释放/获取内存所花费的时间?

【问题讨论】:

  • 您是否尝试过使用分析器?
  • 就我参与的最新项目个人而言,我们假设我们需要一个用于将有大量分配的系统。经过测试,我们认为很难在小分配上击败普通的旧new。似乎(至少在 Windows 7 上的 VS2010 中)重复的小分配速度非常快。
  • 人们编写自定义分配器并不是为了让它们更快,而是为了更有效地管理内存。
  • @MichaelFoukarakis 这通常会使程序更快。
  • @BartekBanachewicz 一个简单的专用分配器很少比通用的malloc/new 慢,没错,但在某些圈子中,主要动机是减少空间开销和减少碎片。事实上,这就是池分配器比性能更好的地方(没有每个块的空间开销;无论分配历史如何,空间都可以 100% 使用)。

标签: c++ c memory-management metrics


【解决方案1】:

我怎么知道有一个?

分析您的代码。

在你的代码中优化一些不是热路径的东西是没有意义的。

如果分配器 (A) 占用了您 5% 的 CPU 时间,而您的应用占用了另外 95% 的时间,则将分配器加速两次会给您带来 (5/2)/100 = 2.5% 提升。现在试着让 B 加速一点点。

如何?

最简单的方法是使用 IDE 内置的分析器;虽然我使用的是 Intel VTune,但 MSVS 相当不错;它的易用性非常好,它只是向您展示 - 在此处进行优化。

使用分析程序有额外的好处;您根本不必修改代码;当您想更改分析选项并再次运行时,您也不必重新编译。话虽如此,应用程序中的计时器也可以提供很好的结果,尽管它们很少需要直接放在分配器中。最好不断缩小程序花费最多时间的可能地方。

【讨论】:

  • @qdii 我想补充一下编写自己的分配器的另一个可能的好处。如果程序员对分配行为有更深入的了解,他可以假设不允许进行通用分配。这提供了优化各种参数分配的可能性,而不仅仅是速度。例如,知道为某个应用程序分配了固定大小这一事实可以通过创建特定分配器来帮助避免堆碎片的风险。这只是一个例子。
  • @junix 自定义内存分配是一个复杂的话题,我认为超出了这个答案的范围。不过,欢迎您发表评论。
  • 是的,我完全同意。我只是认为讨论有点过于“基于速度”,并想说明其他参数可能对这个决定很重要。这就是为什么我决定只对您的答案进行投票并发表评论,而不是创建“替代”答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多