【问题标题】:How do you benchmark memory consumption?您如何对内存消耗进行基准测试?
【发布时间】:2011-11-01 17:37:25
【问题描述】:

我想知道是否有一种有效的方法来测量特定 C 数据结构的实际内存消耗。

目标是根据对这些数据结构进行特定操作后内存使用情况的变化进行基准测试。

我不寻求一种方法来计算正在使用的对象的数量;我确实想知道处于压力下的对象的内存使用量究竟有多大。

是否有标准的方法来做到这一点,无论是在 C 代码中还是从外部? (一些等价于time (1) 实用程序将是一个开始)。

显然,我可以追踪每一个指针并对所有sizeofs 求和。如果这是唯一的方法,请告诉我。我想知道是否有更简单的方法。或者也许是一个图书馆来为我做这件事。

【问题讨论】:

  • 我通过使用 perl 脚本解析 mtrace 的输出来进行此类跟踪。 mtrace 是 glibc 的内置 malloc 跟踪器;它可以通过预加载一个小的 .so 库来激活:stackoverflow.com/q/2593284/196561
  • 这个话题应该会有所帮助:[benchmarks-used-to-test-a-c-and-c-allocator][1] [1]: stackoverflow.com/questions/2560114/…
  • “我不寻求一种方法来计算正在使用的对象的数量”如果你知道对象的数量和它们的大小,你就会知道内存消耗,你的意思是什么?跨度>
  • 您的方式 (sizeof) 似乎是跟踪单个对象消耗的唯一方法。有一些 MS cmd line 工具可用于测量整个程序内存,但由于它在终止时全部由操作系统回收,因此您可以设置断点并以这种方式监控对象的内存消耗。
  • @Andreas,我认为他的意思是这些对象在堆上分配的内存。

标签: c++ c memory benchmarking


【解决方案1】:

是的,cnicutar,在 Linux 上你有 pmap 甚至 pstat。

在 MS 上,有无数的 VStudio 分析工具,具体取决于您对 MS 机器的贡献(甚至是用于 cmd 行的免费工具)。叫我绿喇叭吧,我没有内存泄漏问题。

【讨论】:

    【解决方案2】:

    如果您想在全局级别监控程序的内存使用情况,您可以将 C++ 中的 new/delete 或 C 中的 malloc/free 替换为您自己的函数并记录内存使用情况。

    【讨论】:

    • 这听起来很不错,起初我没有意识到 new/delete 可以承受重载,但浏览了一下,cprogramming.com/tutorial/operator_new.html 我相信这是管理堆的一种非常有效的方法。跨度>
    • 是的,在这种情况下的技术术语不是重载而是替换;)
    • @John:实际上有两个operator new。全局 new/delete 可以被你的实现替换,如果你不替换它们,编译器会提供一个默认版本。你也可以在每个类的基础上重载它们。
    【解决方案3】:

    在 Unix 上用于内存消耗,您可以将 valgrind 与 Massif 工具(+任何可视化工具)一起使用,但我不知道它是否适合您的问题,因为它会为您提供所有内存消耗的详细视图你的程序。

    【讨论】:

    • 我试试看。我想您可以按结构类型对结果进行排序,对吧?
    • @antoine:Massif 只有一个实验性可视化工具(例如,与 Callgrind 相反)。
    • @Thaddee:不,Massif 与语言无关(或几乎)。不过,它会为您提供每次分配的堆栈状态(函数调用),因此您可以在代码中跟踪它们的来源。
    猜你喜欢
    • 2014-12-30
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    相关资源
    最近更新 更多