为什么Valgrind-Massif和最高内存消耗之间会有不同的范围
Why is there differenece between Valgrind-Massif and TOPs memory consumption?
我想测量Linux Ubuntu中程序的内存消耗。我比较了两个工具:valgrind massif和顶部。由于某种原因,即使我使用" - pages-as-heap = yes"显示所有内存。
-
我编译了以下代码:
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; }
当程序处于延迟函数时,顶部命令显示了4200KB虚拟内存的消耗。Valgrind-Massif工具的消耗量为6340608B。哪一个是正确的?为什么有区别?
-
尽管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("%lun",i);
return 0;
}
仍然获得4200kb的顶部,约为6MB,带有massif。我用以下命令编译了代码:
g++ -O2 -Wall myprog.c -o myprog
另外,当我运行程序时,我使用以下方式增加了堆栈大小:Ulimit -s 20000000当使用massIF运行程序时,我还增加了堆栈尺寸,因此我不会堆栈溢出。而且我仍然得到相同的结果。
看起来您正在尝试介绍调试构建(这完全毫无意义(。因为在发行中构建这两个程序都只会有一个虚拟主PROC作为编译器,因为它们没有副作用,因此将所有计算丢弃。第二个程序也会导致堆栈溢出,因为您正在尝试在堆栈上分配大量数组。
- 基于范围的 for 循环range_declaration中各种说明符之间的性能差异
- C++ 中的类之间的数据重新循环 - 错误:'<class name>'未在此范围内声明
- 类型大小与其值范围之间的关系?
- 使用 std::binomial_distribution 在范围之间生成随机数
- 重命名两个目录中的文件名,如果它们之间的某些字符匹配 - 矢量下标超出范围
- 为什么Valgrind-Massif和最高内存消耗之间会有不同的范围
- 范围V3.两个范围之间的区别
- 我正在尝试创建一个程序,用户在其中输入一系列数字,并且我想列出范围之间的质数
- 给定范围之间有多少个素数?C++
- 在基于范围的 for 循环中,& 和 && 之间有什么区别?
- 变量超出C++类之间的范围
- 在可能重叠的范围之间复制类
- BOOST_FOREACH 和 c++11 之间基于范围的循环的区别
- 范围和封装之间的区别是什么?(C++)
- 固定范围的随机数介于100和149之间(包括100和149)
- 由于在序列点之间修改变量两次而导致的 UB 是否会转移到"inner"范围?
- 检查一对值是否位于范围数组中的范围之间
- 两个范围之间的随机数
- 将范围之间的字符串向量转换为带分隔符的字符串(允许增强)
- 当m和n在10^10范围内相当大时,使用埃拉托色尼筛法打印m和n之间的素数