linux下测试程序中各函数执行时间工具

时间都去哪了~,还没好好感受过你的速度呢,为什么修改了这么多次,你依然跑的这么慢呢?时间都去哪了~~
好吧,跑题了,下面是转载的文章,主要介绍了两个测试程序的工具,代码改几次运行时间依然降不下来,恩,现在就拿刀解剖它,看看到底那里在耗时。
有些时候,我们特别关注程序的性能,特别是底层软件,比如驱动程序,OS等。为了更好的优化程序性能,我们必须找到性能瓶颈点,“好钢用在刀刃上”才能取 得好的效果,否则可能白做工作。为了找到关键路径,我们可以使用profilng技术,在linux平台上,我们可以使用gprof和oprofile工 具。
gprof是GNU工具之一,它在编译的时候在每个函数的出入口加入了profiling的代码,运行时统计程序在用户态的 执行信息,可以得到每个函数的调用次数,执行时间,调用关系等信息,简单易懂。适合于查找用户级程序的性能瓶颈,对于很多时间都在内核态执行的程 序,gprof不适合。
oprofile也是一个开源的profiling工具,它使用硬件调试寄存器来统计信息,进 行profiling的开销比较小,而且可以对内核进行profiling。它统计的信息非常的多,可以得到cache的缺失率,memory的访存信 息,分支预测错误率等等,这些信息gprof是得不到的,但是对于函数调用次数,它是不能够得到的。。
    简单来说,gprof简单,适合于查找用户级程序的瓶颈,而oprofile稍显复杂,但是得到的信息更多,更适合调试系统软件。
    我们以编译运行hello.c为例,来说明如何使用这两个工具,这里不解释具体结果的含义,要想详细了解每个结果代表什么意思,可以看一下参考资料中官方站点上的doc信息,里面会给你详尽的解释。
gprof Quick Start
    gprof是gnu binutils工具之一,默认情况下linux系统当中都带有这个工具。

使用 -pg 选项来编译hello.c,如果要得到带注释的源码清单,则需要增加 -g 选项。运行: gcc -pg -g -o hello hello.c
运行应用程序: ./hello 会在当前目录下产生gmon.out文件
使用gprof来分析gmon.out文件,需要把它和产生它的应用程序关联起来:
gprof hello gmon.out -p 得到每个函数占用的执行时间
gprof hello gmon.out -q 得到call graph,包含了每个函数的调用关系,调用次数,执行时间等信息。
gprof hello gmon.out -A 得到 一个带注释的“源代码清单”,它会注释源码,指出每个函数的执行次数。这需要在编译的时候增加 -g选项。
oprofile Quick Start
    oprofile是sourceforge上面的一个开源项目,在2.6内核上带有这个工具,好像只有smp系统才有。比较老的系统,需要自己安装,重新编译内核。
    oprofile是一套工具,分别完成不同的事情。
op_help: 列出所有支持的事件。
opcontrol:设置需要收集的事件。
opreport: 对结果进行统计输出。
opannaotate:产生带注释的源/汇编文件,源语言级的注释需要编译源文件时的支持。
opstack:    产生调用图profile,但要求x86/2.6的平台,并且linux2.6安装了call-graph patch
opgprof:    产生如gprof相似的结果。
oparchive: 将所有的原始数据文件收集打包,可以到另一台机器上进行分析。
op_import: 将采样的数据库文件从另一种abi转化成本地格式。
    运行oprofile需要root权限,因为它要加载profile模块,启动oprofiled后台程序等。所以在运行之前,就需要切换到root。

opcontrol --init 加载模块,mout /dev/oprofile 创建必需的文件和目录
opcontrol --no-vmlinux 或者 opcontrol --vmlinux=/boot/vmlinux-`uname -r` 决定是否对kernel进行profiling
opcontrol --reset 清楚当前会话中的数据
opcontrol --start 开始profiling
./hello 运行应用程序,oprofile会对它进行profiling
opcontrol --dump 把收集到的数据写入文件
opcontrol --stop 停止profiling
opcotrol -h 关闭守护进程oprofiled
opcontrol --shutdown 停止oprofiled
opcontrol --deinit 卸载模块
常用的是3→7这几个过程,得到性能数据之后,可以使用opreport, opstack, opgprof, opannotate几个工具进行分析,我常用的是opreport, opannotate进行分析。
opreport使用 http://oprofile.sourceforge.net/doc/opreport.html
opannotate使用
http://oprofile.sourceforge.net/doc/opannotate.html
opgprof使用
http://oprofile.sourceforge.net/doc/opgprof.html
最常用的是opreport,这个可以给出image和symbols的信息,比如我想得到每个函数的执行时间占用比例等信息,用来发现系统性能瓶颈。opannotate可以对源码进行注释,指出哪个地方占用时间比较多。常用命令如下:
opreport -l /bin/bash --exclude-depand --threshold 1 , 用来发现系统瓶颈。
opannotate --source --output-dir=annotated /usr/local/oprofile-pp/bin/oprofiled
opannotate --source --base-dirs=/tmp/build/libfoo/ --search-dirs=/home/user/libfoo/ --output-dir=annotated/ /lib/libfoo.so
网络资源
gprof 用户手册 http://sourceware.org/binutils/docs-2.17/gprof/index.html
oprofile官方站点
http://oprofile.sourceforge.net/
使用 GNU profiler 来提高代码运行速度
http://www-128.ibm.com/developerworks/cn/linux/l-gnuprof.html
使用 OProfile for Linux on POWER 识别性能瓶颈
http://www-128.ibm.com/developerworks/cn/linux/l-pow-oprofile/

本文来自CSDN博客,转载请标明出处: http://blog.csdn.net/To_Utopia/archive/2010/08/18/5820943.aspx
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: linux串口回环测试程序是一种测试串口通信功能的程序,通过将发送的数据回传给接收端进行验证,以确定串口是否正常工作。 要实现该测试程序,首先需要打开串口设备文件。在Linux,串口设备文件通常位于/dev目录下,如/dev/ttyS0代表第一个串口设备。可以使用open()函数来打开串口设备文件,例如open("/dev/ttyS0", O_RDWR)。 接下来,需要设置串口的参数,包括波特率、数据位、停止位等。可以使用termios结构体和tcsetattr函数来设置串口参数,例如: struct termios oldTio, newTio; tcgetattr(fd, &oldTio); newTio = oldTio; cfsetispeed(&newTio, B9600); // 设置波特率为9600 cfsetospeed(&newTio, B9600); newTio.c_cflag &= ~PARENB; // 不启用奇偶校验 newTio.c_cflag &= ~CSTOPB; // 停止位为1 newTio.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 关闭标准模式和回显 tcsetattr(fd, TCSANOW, &newTio); 然后,可以使用read()函数从串口读取接收到的数据,并使用write()函数将该数据发送回串口。可以使用一个循环来实现不断进行回环测试,例如: while (1) { char buffer[256]; int bytesRead = read(fd, buffer, sizeof(buffer)); write(fd, buffer, bytesRead); } 最后,需要关闭串口设备文件,可以使用close()函数来关闭已打开的串口设备文件,例如close(fd)。 通过运行该回环测试程序,可以验证串口设备是否正常工作,是否能正常发送和接收数据。 ### 回答2: Linux串口回环测试程序是一种用于测试串口通信功能的程序。串口是一种用于将数据通过物理电缆传输的通信接口,常用于连接计算机与外部设备。 Linux系统提供了一种简单而有效的方法来测试串口的功能,即通过发送数据并接收相同数据来完成回环测试。以下是一个实现简单串口回环测试的示例程序: 1. 首先,打开终端并进入Linux系统。 2. 使用命令行工具编写一个C语言程序,实现串口回环测试。 ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> #include <termios.h> int main() { int serial_port; char data[10] = "Hello!"; // 打开串口设备文件 serial_port = open("/dev/ttyS0", O_RDWR); if (serial_port < 0) { printf("无法打开串口设备文件。\n"); return -1; } // 配置串口 struct termios tty; tcgetattr(serial_port, &tty); cfsetospeed(&tty, B9600); cfsetispeed(&tty, B9600); tty.c_cflag &= ~PARENB; tty.c_cflag &= ~CSTOPB; tty.c_cflag &= ~CSIZE; tty.c_cflag |= CS8; tty.c_cflag &= ~CRTSCTS; tty.c_cflag |= CREAD | CLOCAL; tty.c_iflag &= ~(IXON | IXOFF | IXANY); tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); tty.c_oflag &= ~OPOST; tcsetattr(serial_port, TCSANOW, &tty); // 发送数据 write(serial_port, &data, sizeof(data)); // 接收数据 char receivedData[10]; read(serial_port, &receivedData, sizeof(receivedData)); // 检查数据 if (strcmp(data, receivedData) == 0) { printf("串口回环测试成功!\n"); } else { printf("串口回环测试失败。\n"); } // 关闭串口 close(serial_port); return 0; } ``` 3. 保存程序并编译为可执行文件,例如命名为"serial_test"。 4. 运行程序,它将打开串口设备文件,并将数据发送到串口。然后,它将等待接收到来自串口的相同数据,并将其与发送的数据进行比较。如果两者相同,则表示串口回环测试成功,否则表示失败。 需要注意的是,在代码使用的串口设备文件"/dev/ttyS0"是一个示例,实际使用时应根据不同的系统和串口配置来修改。 串口回环测试程序对于验证串口通信的可靠性和正确性非常有用。 ### 回答3: Linux串口回环测试程序可以通过打开两个串口设备,一个作为发送端口,一个作为接收端口,实现数据的发送和接收。具体步骤如下: 1. 首先,在终端输入以下命令,加载UART设备驱动: ``` sudo modprobe serial ``` 2. 使用`ls /dev/tty*`命令查看系统的串口设备,记下发送端口和接收端口的设备名称,例如`/dev/ttyUSB0`和`/dev/ttyUSB1`。 3. 创建一个C语言源文件,例如`serial_test.c`,编写串口回环测试程序的代码。 4. 在代码,首先使用`open()`函数打开发送端口和接收端口的设备文件,成功打开后会返回一个文件描述符。 5. 接下来,使用`ioctl()`函数设置串口的通信参数,例如波特率、数据位、停止位和奇偶校验位等。这里可以使用`struct termios`结构体来设置通信参数。 6. 然后,利用`tcflush()`函数刷新发送端口和接收端口的输入输出缓冲区。 7. 接下来,进入一个循环,从发送端口读取数据,并将读取到的数据写入接收端口。可以使用`read()`函数和`write()`函数分别进行读取和写入操作。 8. 最后,使用`close()`函数关闭发送端口和接收端口的设备文件,释放资源。 9. 编译并运行程序,可以使用以下命令进行编译和执行: ``` gcc -o serial_test serial_test.c ./serial_test ``` 通过以上步骤,就可以实现Linux串口回环测试程序,用于测试串口的通信功能是否正常。在测试时,可以通过发送一些数据,并检查接收端是否能够正确接收到相同的数据,以验证串口的回环功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值