Chinaunix首页 | 论坛 | 博客
  • 博客访问: 773753
  • 博文数量: 196
  • 博客积分: 115
  • 博客等级: 民兵
  • 技术积分: 354
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-13 23:19
文章分类

全部博文(196)

文章存档

2021年(1)

2019年(5)

2018年(11)

2017年(15)

2016年(13)

2015年(46)

2014年(81)

2013年(22)

2012年(2)

分类: C/C++

2014-01-09 14:11:01

valgrind在C语言编程中,对程序的性能调试,判断一个程序的代码质量是否高效有很明显的用处。下面具体分析一下:

测试程序的CPU命中率(CPU cache hit/miss rate)
模拟写两个小程序,用来测试CPU的缓存命中率,分别名为cache1.c和cache2.c.

cache1.c代码如下:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. #define MAXROW 8000
  3. #define MAXCOL 8000

  4. int main () {

  5. int i,j;

  6. static int x[MAXROW][MAXCOL];

  7. printf ("Starting!\n");

  8.          for (i=0;i<MAXROW;i++)

  9.                         for (j=0;j<MAXCOL;j++)

  10.                 x[i][j] = i*j;

  11. printf("Completed!\n");

  12. return 0;

  13. }
cache2.c代码如下:

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. #define MAXROW 8000
  3. #define MAXCOL 8000

  4. int main () {

  5. int i,j;

  6. static int x[MAXROW][MAXCOL];

  7. printf ("Starting!\n");

  8.          for (j=0;j<MAXCOL;j++)

  9.                         for (i=0;i<MAXROW;i++)

  10.                 x[i][j] = i*j;

  11. printf("Completed!\n");

  12. return 0;

  13. }


编译cache1.c运行程序后查看命CPU缓存命中率结果


编译cache2.c运行程序后查看命CPU缓存命中率结果

显然是cache1的cache miss rate较低,程序的代码质量更高效.

测试程序的内存泄漏(memory leak)

当前系统gcc的版本

写个小的测试程序

点击(此处)折叠或打开

  1. #include <stdio.h>

  2. #define M 5

  3. int main(void) {

  4. int i;

  5. int a[M]={11,22,33,44,55};

  6. for (i=0;i<sizeof(a)/sizeof(a[0]);i++)

  7. printf ("%d = %p\n",*(a+i),a+i);

  8. printf ("%d = %p\n",a[5],&a[5]);

  9.    return 0;

  10. }

使用默认功能的gcc编译,运行显示正常,其实已经存在数组越界的问题,那么再用valgrind测试一下程序的是否存在内存泄.

结果也没有发现内存泄漏.

然后让gcc支持mudflap功能,RHEL/CentOS需要安装libmudflap-4.1.2-52.el5和libmudflap-devel-4.1.2-52.el5两个rpm包,再用gcc带mudflap功能编译,执行程序看效果


可以看出当去读取数组下标为5的值时,出现了数组越界的问题,默认的gcc编辑器是不会去关心数组越界问题的.

以上是用valgrind测试内存泄漏的用法,不过有时valgrind检测不到,可以用mudflap的强大功能查出内存泄漏的问题,不过需要注意的是mudflap对系统资源的消耗也很大,有利有弊,在特定的时候用一下还是很不错的选择.


阅读(907) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~