微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > Linux下C应用程序开发

Linux下C应用程序开发

时间:05-20 来源:互联网 点击:

下面的例子是 indent 的缺省输出:

运行 indent 以前的 C 代码:

#include stdio.h>;

static void my_print (char *);
  static void my_print2 (char *);

main ()
  {
  char my_string[] = hello world!;
  my_print (my_string);
  my_print2 (my_string);
  }

void my_print (char *string)
  {
  printf (The string is %s , string);
  }

void my_print2 (char *string)
  {
  char *string2; int size, i;

size = strlen (string);
  string2 = (char *) malloc (size + 1);
  for (i = 0; i size; i++) string2[size -1 - i] = string;
  string2[size] = '';

printf (The string printed backward is %s , string2);
  }
  运行 indent 后的 C 代码:

#include stdio.h>;
  static void my_print (char *);
  static void my_print2 (char *);
  main ()
  {
  char my_string[] = hello world!;
  my_print (my_string);
  my_print2 (my_string);
  }
  void
  my_print (char *string)
  {
  printf (The string is %s , string);
  }
  void
  my_print2 (char *string)
  {
  char *string2;
  int size, i;
  size = strlen (string);
  string2 = (char *) malloc (size + 1);
  for (i = 0; i size; i++)
  string2[size - 1 - i] = string;
  string2[size] = '';
  printf (The string printed backward is %s , string2);
  }
  indent 并不改变代码的实质内容, 而只是改变代码的外观. 使它变得更可读, 这永远是一件好事.

gprof
  gprof 是安装在你的 Linux 系统的 /usr/bin 目录下的一个程序. 它使你能剖析你的程序从而知道程序的哪一个部分在执行时最费时间.

gprof 将告诉你程序里每个函数被调用的次数和每个函数执行时所占时间的百分比. 你如果想提高你的程序性能的话这些信息非常有用.

为了在你的程序上使用 gprof, 你必须在编译程序时加上 -pg 选项. 这将使程序在每次执行时产生一个叫 gmon.out 的文件. gprof 用这个文件产生剖析信息.

在你运行了你的程序并产生了 gmon.out 文件后你能用下面的命令获得剖析信息:

gprof program_name>;
  参数 program_name 是产生 gmon.out 文件的程序的名字.

为了说明问题,在程序中增加了函数count_sum()以消耗CPU时间,程序如下
  #include stdio.h>;

static void my_print (char *);
  static void my_print2 (char *);

main ()
  {
  char my_string[] = hello world!;
  my_print (my_string);
  my_print2 (my_string);
  my_print (my_string);
  }

void count_sum()
  {
  int i,sum=0;
  for(i=0; i1000000; i++)
  sum += i;
  }

void my_print (char *string)
  {
  count_sum();
  printf (The string is %s , string);
  }

void my_print2 (char *string)
  {
  char *string2;
  int size, i,sum =0;

count_sum();
  size = strlen (string);
  string2 = (char *) malloc (size + 1);
  for (i = 0; i size; i++) string2[size -1 - i] = string;
  string2[size] = '';
  for(i=0; i5000000; i++)
  sum += i;

printf (The string printed backward is %s , string2);
  }
  $ gcc -pg -o hello hello.c
  $ ./hello
  $ gprof hello | more
  将产生以下的输出
  Flat profile:

Each sample counts as 0.01 seconds.
  % cumulative self self total
  time seconds seconds calls us/call us/call name
  69.23 0.09 0.09 1 90000.00 103333.33 my_print2
  30.77 0.13 0.04 3 13333.33 13333.33 count_sum
  0.00 0.13 0.00 2 0.00 13333.33 my_print

% 执行此函数所占用的时间占程序总
  time 执行时间的百分比

cumulative 累计秒数 执行此函数花费的时间
  seconds (包括此函数调用其它函数花费的时间)

self 执行此函数花费的时间
  seconds (调用其它函数花费的时间不计算在内)

calls 调用次数

self 每此执行此函数花费的微秒时间
  us/call

total 每此执行此函数加上它调用其它函数
  us/call 花费的微秒时间

name 函数名

由以上数据可以看出,执行my_print()函数本身没花费什么时间,但是它又调用了
count_sum()函数,所以累计秒数为0.13.

技巧: gprof 产生的剖析数据很大, 如果你想检查这些数据的话最好把输出重定向到一个文件里.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top