linux下统计代码执行时间

转载自:http://velep.com/archives/973.html

统计函数或某一段代码的运行时间在软件开发中常常遇到。透过运行时间可分析出函数或程序段的运行效率和性能,从而有针对性的对代码进行优化。

在unix环境中,常常用binutils(GNU二进制工具集)中的gprof工具来查看函数运行时间。但本文的重点是自己编写代码实现函数或程序段运行时间的统计。下面进行详细描述。

实现原理

实现原理很简单,在函数或程序段开始运行前,记录开始时间。运行完成后,记录结束时间。把结束时间与开始时间相减,得到总的运行时间。

通常情况下,函数或程序段运行时间比较短暂,一般为us或ms级别。为得到比较准确的运行时间,通常做法是:重复N次运行函数或程序段,得到N次运行的总时间T。单次运行时间 = T / N。N越大,得到的运行时间越准确。

现在的问题是如何获取开始和和结束时间,而且时间的精度要达到us级。

gettimeofday()函数

gettimeofday()函数用于取得当前的时间,时间精度可达到us级别。

头文件:#include <sys/time.h>

函数原型:int gettimeofday(struct timeval * tv, struct timezone * tz);

函数说明:gettimeofday()函数会把目前的时间由tv所指的结构体返回,当地时区的信息则放到tz所指的结构体中。

timeval结构体定义:
    struct timeval {
        time_t      tv_sec;
        suseconds_t tv_usec;
    };

timezone结构体定义:
    struct timezone {
        int tz_minuteswest; /* 和Greenwich差了多少分钟 */
        int tz_dsttime;     /* 日光节约时间的状态 */
    };

上述两个结构体都定义在/usr/include/sys/time.h文件中。tz_dsttime所代表的状态如下:

DST_NONE:不使用
    DST_USA:美国
    DST_AUST:澳洲
    DST_WET:西欧
    DST_MET:中欧
    DST_EET:东欧
    DST_CAN:加拿大
    DST_GB:大不列颠
    DST_RUM:罗马尼亚
    DST_TUR:土耳其
    DST_AUSTALT:澳洲(1986年以后)

函数返回值:成功返回0,失败返回-1,错误码存于errno。

程序示例

下面的代码展示了如何使用gettimeofday()函数来统计函数或某一段代码的运行时间。

/*
 * Test function run time.
 */

#include <stdio.h>
#include <sys/time.h>

void func(void)
{
    double c = 2.5641321, d = 0.00158;
    double val = 0.0;

    for (int i = 0; i < 1000000; i++)
    {
        val += (c * c) + (d * d) + (2 * c * d);
    }

    return;
}

int main(int argc, char **argv)
{
    struct timeval tpstart, tpend;
    float timeuse;

    gettimeofday(&tpstart, NULL);

    func();

    gettimeofday(&tpend, NULL);
    timeuse = 1000000 * (tpend.tv_sec - tpstart.tv_sec) + tpend.tv_usec - tpstart.tv_usec;
    timeuse /= 1000000;

    printf("Used Time: %f seconds\n", timeuse);

    return  0;
}

这种方法,不仅适用于linux程序,也适用于eCos应用程序。

linux下统计代码执行时间

时间: 2024-10-31 02:34:23

linux下统计代码执行时间的相关文章

Linux下统计代码行数

使用wc统计代码行数 最近写了一些代码,想统计一下代码的行数,在eclipse中好像没这功能,网上搜了一下才发现原来Linux有一个统计文件行数的命令wc.使用wc可以打印出每个文件和总文件的行数.字数和字节数,如果没有指定文件,则会读取标准输入(一般是终端)做统计.格式如下: Usage: wc [OPTION]... [FILE]... -c, --bytes, --chars print the byte counts -l, --lines print the newline count

统计代码执行时间,使用Stopwatch和UserProcessorTime的区别

当我们需要统计一段代码的执行时间,首先想到的可能是Stopwatch类.在这里,先暂不使用Stopwatch,自定义一个统计代码执行时间的类,大致需要考虑到: 1.确保统计的是当前进程.当前线程中代码的执行时间.2.在统计执行过程中,不允许有垃圾回收.即在统计代码执行时间之前,就让GC完成垃圾回收. 举例:统计显示一个数组元素所消耗的时间 class Program { static void Main(string[] args) { int[] arrs = new int[10000];

Linux下获取代码文件名、代码所在行数及日期时间的C程序实现

一.概述 在实际的软件开发项目中,为了方便排查程序问题,要求在日志文件中输出日志信息所在的程序文件名及日志代码所在的行数.此外,某些软件还会要求将程序启动时的日期时间输出到日志文件中,方便跟踪软件运行状况. 本文介绍了Linux下获取代码文件名.代码行数及日期时间的C代码实现. 二.几个标准预定义宏简介 在C语言中,使用几个标准预定义宏,便可轻松实现获取代码文件名.代码行数及日期时间的功能. 这几个宏的定义如下(注意:前后都是两条连续的下划线): __FILE__:在源文件中插入当前源文件名.

Linux下统计出现次数最多的指定字段值

假设桌面上有一个叫“data.txt”的文本,内容如下: {id='xxx' info='xxx' kk='xxx' target='111111' dd='xxx'}{id='xxx' info='xxx' kk='xxx' target='777' dd='xxx'}{id='xxx' info='xxx' kk='xxx' target='yyyy' dd='xxx'}{id='xxx' info='xxx' kk='xxx' target='5555' dd='xxx'}{id='xxx

linux下统计目录下所有子目录的大小

du -sh * --exclude=tar |awk '{v=substr($1,length($1),1)}v=="G"{$0="1G "$0}v=="M"{$0="2M "$0}v=="K"{$0="3K "$0}v=="0"{$0="4Z "$0}!system("[ -d "$NF" ]")' |s

linux下的代码比较工具

在linux下有很多不错的代码比较工具:meld.DiffMerge.xxdiff.diffuse.Kompare等... diff : 文件比较工具用于比较计算机上的文件的内容,找到他们之间相同与不同之处.比较的结果通常被称为diff. diff同时也是一个基于控制台的.能输出两个文件之间不同之处的著名的文件比较程序的名字.diff是于二十世纪70年代早期, 在Unix操作系统上被开发出来的.diff将会把两个文件之间不同之处的部分进行输出. 1. meld 1)工具介绍: Meld是一个适用

Linux下 vim代码编译器的使用

首先在命令行模式下输入代码: vim ok.c 创建c文件 如果发现vim没有被安装的话,输入以下代码对vim进行安装: sudo apt install vim 安装完毕之后再输入第一行代码,之后进入程序编译界面,输入我们需要的程序,例如: #include<stdio.h> int main() { printf("我是一个大傻子"); } 然后按下键盘Esc,再输入wq: 这样刚刚写下的代码就被保存好了,并且我们可以发现刚刚写下的代码绝对是代码高亮的,看起来十分清楚.

Linux下安装代码统计工具git_stats

(一).简介git_stats:仓库代码统计工具之一,可以按git提交人.提交次数.修改文件数.代码行数.注释量在时间维度上进行统计,亦可按各文件类型进行简单的统计,非常方便. 虽然以代码行数来衡量项目或者程序员并不是一件靠谱的事,但是从统计角度看趋势对于技术管理人员还是很有帮助的!GitStats就是这样的工具,它能生成以下统计数据,并以图表形式进行对比 常规的统计:文件总数,行数,提交量,作者数. 活跃性:每天中每小时的.每周中每天的.每周中每小时的.每年中每月的.每年的提交量. 作者数:列

Linux 下统计文件夹大小及文件数量

[查看文件夹大小] # /lib 目录大小 du -sh /lib # /lib 子目录大小  du -sh /lib/*   # 查看 /lib 目录下普通文件大小 find /lib -type f | xargs ls -la | awk -F ' ' 'BEGIN{sum=0} {sum+=$5} END{printf "%d bytes\n", sum}' [统计文件数量] # 查看 /lib 目录的总文件数(包含7种文件类型.包含 /lib 目录自身) find /lib