您现在的位置是:主页 > news > 武汉优联网站建设/北京营销推广公司

武汉优联网站建设/北京营销推广公司

admin2025/6/12 22:10:32news

简介武汉优联网站建设,北京营销推广公司,wordpress美食主题,一品威客网是做啥的网站valgrind在C语言编程中,对程序的性能调试,判断一个程序的代码质量是否高效有很明显的用处。下面具体分析一下:测试程序的CPU命中率(CPU cache hit/miss rate):模拟写两个小程序,用来测试CPU的缓…

武汉优联网站建设,北京营销推广公司,wordpress美食主题,一品威客网是做啥的网站valgrind在C语言编程中,对程序的性能调试,判断一个程序的代码质量是否高效有很明显的用处。下面具体分析一下:测试程序的CPU命中率(CPU cache hit/miss rate):模拟写两个小程序,用来测试CPU的缓…

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

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

cache1.c代码如下:

#include <stdio.h>#define MAXROW 8000#define MAXCOL 8000int main () {int i,j;static int x[MAXROW][MAXCOL];printf ("Starting!\n");for (i=0;i<MAXROW;i++)for (j=0;j<MAXCOL;j++)x[i][j] = i*j;printf("Completed!\n");return 0;}

cache2.c代码如下:

#include <stdio.h>#define MAXROW 8000#define MAXCOL 8000int main () {int i,j;static int x[MAXROW][MAXCOL];printf ("Starting!\n");for (j=0;j<MAXCOL;j++)for (i=0;i<MAXROW;i++)x[i][j] = i*j;printf("Completed!\n");return 0;}

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

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

wKiom1NLcPmTeEhqAAJ6b03b5CU009.jpg

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

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

当前系统gcc的版本

wKiom1NLcSXToBIXAACvHEptLtE762.jpg

写个小的测试程序

#include <stdio.h>#define M 5int main(void) {int i;int a[M]={11,22,33,44,55};for (i=0;i<sizeof(a)/sizeof(a[0]);i++)printf ("%d = %p\n",*(a+i),a+i);printf ("%d = %p\n",a[5],&a[5]);return 0;}

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

wKioL1NLcTmTHyuGAAJkcQd1vd8080.jpg

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

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

wKioL1NLcVGDhoKlAAIF2Doy15M066.jpg

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

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