如何对内存消耗进行基准测试?

9
我想知道是否有一种有效的方法来测量特定C数据结构的实际内存消耗。目标是基于这些数据结构在特定操作后内存使用情况的变化来进行基准测试。我不寻求计算正在使用的对象数量的方法,我希望确切地知道一个对象在压力下可以占用多大的内存。是否有一种标准的方式来实现这一点,无论是在C代码中还是从外部进行?(某些类似于time(1)实用程序的等效物将是一个开始)。显然,我可以跟踪每个指针并对所有sizeof进行求和。如果这是唯一的方法,请告诉我。我想知道是否有一种更简单的方法,或者是否有一个库可以为我完成这项工作。

2
我通过使用Perl脚本解析mtrace的输出来进行此类跟踪。 mtrace是glibc的内置malloc跟踪器;它可以通过预加载一个小的.so库来激活:https://dev59.com/pk3Sa4cB1Zd3GeqPrgjn - osgx
1
这个主题应该很有帮助:用于测试C和C++分配器的基准测试 - Michaël
1
@Andreas,我认为他指的是那些对象在堆上分配的内存。 - John
你能具体说明你需要哪个编译器/平台的详细信息吗?C++工具通常是针对特定平台的。 - Matthieu M.
@Matthieu 我希望解决方案不是特定于平台的,但我主要对类Unix系统感兴趣。 - Thaddee Tyl
显示剩余2条评论
3个回答

3

如果您想在全局层面监控程序的内存使用情况,可以用自己的函数代替 C++ 中的 new/delete 或 C 语言中的 malloc/free 并记录内存使用情况。


听起来非常不错,起初我没有意识到new/delete可以重载,但是经过浏览http://www.cprogramming.com/tutorial/operator_new.html后,我相信这是管理堆的一种非常有效的方式。 - John
1
是的,在这种情况下,技术术语不是重载而是替换 ;) - Andreas Brinck
@John:实际上有两个 operator new。全局的 new/delete 可以被你的实现所替换,如果你不替换它们,编译器会提供一个默认版本。你也可以按类别重载它们。 - Matthieu M.

3

在Unix系统中,如果你想检测内存消耗,可以使用valgrind工具的Massif功能(再加上任何可视化工具)。但我不确定它是否适用于你的问题,因为它会详细展示程序的所有内存消耗情况。


我来试试。我猜你可以按结构类型对结果进行排序,对吧? - Thaddee Tyl
@antoine:与Callgrind等工具不同,Massif只有一个实验性的可视化工具。 - Matthieu M.
@Thaddee:不,Massif是语言无关的(或几乎无关)。但它可以为每个分配提供堆栈(函数调用)的状态,所以你可以在代码中跟踪它们的来源。 - Matthieu M.

0

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

在MS上,根据你对MS机器的贡献,有无数的VStudio性能分析工具(甚至有免费的命令行使用工具)。叫我一个新手吧,我没有内存泄漏的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接