2017-04-24 62 views
1

我想在linux ubuntu中测量一个程序的内存消耗。我比较了两种工具:Valgrind Massif和TOP。出于某种原因,即使当我使用“--pages-as-heap = yes”来显示所有内存时,我也得到了不同的结果。为什么Valgrind-Massif和TOPs内存消耗之间存在差异?

  1. 我编译以下代码:

    void delay(double secs) 
    { 
        int i,j; 
        for(j=0;j<5000*secs;j++) 
         for(i=0;i<99999;i++); 
    } 
    int main() { 
        delay(30); 
    return 0; } 
    

TOP命令显示的虚拟内存4200KB的消耗,同时该方案是在延迟功能。 Valgrind-Massif工具消耗了6340608B。哪一个是正确的?为什么会有差异?

  1. 尽管Massif网站告诉用“--pages-as-heap = yes”选项启用堆栈也是测量的,但我没有成功。例如,对于下面的程序:

    #include <stdlib.h> 
    void delay(double secs) 
    { 
        int i,j; 
        for(j=0;j<5000*secs;j++) 
         for(i=0;i<99999;i++); 
    } 
    void func(int n) 
    { 
        char x[2000000]; 
        int i; 
        if(n==0) 
        return; 
        for(i=0;i<2000000;i++) 
         x[i]=(char)n; 
        delay(15); // Delay number 2,3,4,5 
        func(n-1); 
        return; 
    } 
    int main() { 
        delay(30); // Delay number 1 
        func(4); 
        delay(30); // Delay number 6 
        return 0;} 
    

由TOP报告的存储器消耗量为:4200 KB,然后6032KB,然后7984 KB,然后9936 KB,然后11892 KB,然后13844 KB。然而,Massif在节目开始时只报道了6336512 B(事实上,内存有一些波动,但它们停止得很快,而且它们不是很大)。似乎由于某种原因,Massif并未在此设置下测量堆叠。为什么会发生?

编辑:

我试图在发布模式下编译,但得到了同样的问题。 我编译如下代码:

#include<stdio.h> 
#include <stdlib.h> 
unsigned long delay(double secs) 
{ long i,j,k,counter=0; 
    for(k=0;k<160000;k++) 
    for(j=0;j<5000*secs;j++) 
     for(i=0;i<99999;i++) 
      counter++; 
    return counter; 
} 
int main() 
{ 
    unsigned long i; 
    i=delay(10); 
    printf("%lu\n",i); 
    return 0; 
} 

,还是把4200KB与TOP,以及约6MB与地块。 予编译的代码用下面的命令:

g++ -O2 -Wall myprog.c -o myprog 

此外,当我跑的程序予增加使用的堆栈大小: 的ulimit -s 20亿 并且当跑了地块程序我还增加了堆栈大小,所以我不会得到堆栈溢出。我仍然得到相同的结果。

回答

1

它看起来像你试图剖析调试版本(这是完全没有意义的)。因为在发行版本中,这两个程序都只有一个虚拟主程序作为编译程序,因为它们没有副作用,所有计算都扔掉了。另外第二个程序会导致堆栈溢出,因为您正试图在堆栈上分配巨大的数组。

+0

请参阅我上面的修改。 –

+0

您编辑的示例根本不占用堆栈,因此不需要增加允许的堆栈大小使用。此外,top报告的内存消耗非常少,大约为4200字节(你可能在你的问题上犯了一个错字),我想它不包括valgrind考虑的映射可执行页面的大小。因此valgrind会报告更高的内存消耗。单独stdlib是〜5Mb,所以它是有道理的。 – VTT

相关问题