2011-08-23 116 views
3

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

目标是根据在这些数据结构上进行特定操作后内存使用情况如何变化来制定基准。

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

有没有一种标准的方式来做到这一点,无论是在C代码,还是从外部? (一些相当于time(1)实用程序将是一个开始)。

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

+2

我通过用perl脚本解析mtrace的输出来做了这样的跟踪。 mtrace是glibc的内建malloc示踪器;它可以通过预加载一个小的.so库来激活:http://stackoverflow.com/q/2593284/196561 – osgx

+1

这个主题应该是有帮助的:[基准测试使用的测试交流和分配器] [ 1] [1]:http://stackoverflow.com/questions/2560114/benchmarks-used-to-test-ac-and-c-allocator – malinois

+0

“我不寻求方法来计算的使用的对象的数量“如果你知道对象的数量和它们的大小,你就会知道内存消耗,非常明显你是什么意思? –

回答

0

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

在MS上,根据您对MS计算机的贡献(甚至是用于cmd行使用的免费计算机),MS上有许多用于VStudio的分析工具。叫我绿色的喇叭,我没有内存泄漏的问题。

+0

http://stackoverflow.com/questions/700097/memory-allocation-profiling-in-c – John

1

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

+0

这听起来很不错,起初我没有意识到新/删除可以超载,但通过浏览,http:///www.cprogramming.com/tutorial/operator_new.html我相信这是一个非常有效的方式来管理堆。 – John

+1

是的,在这种情况下的技术术语不是超载,而是替换;) –

+0

@约翰:事实上有两个'operator new'。全局'new' /'delete'可以替换为你的实现,如果你不替换它们,编译器会提供一个默认的版本。您也可以按班级重载它们。 –

1

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

+0

我会试试看。我想你可以按结构类型排序结果,对吗? –

+0

@antoine:Massif只有一个实验性可视化工具(与Callgrind相反,例如)。 –

+0

@Thaddee:不,Massif是语言不可知的(或几乎)。它为你提供了每个分配的堆栈状态(函数调用),所以你可以在你的代码中追踪它们来自哪里。 –