首页 资讯 应用 高压 设计 行业 低压 电路图 关于

嵌入式

旗下栏目: PLC 嵌入式 单片机 DCS

linux下统计代码执行时间

嵌入式 | 发布时间:2018-09-18 | 人气: | #评论# | 本文关键字:linux
摘要:统计函数或某一段代码的运行时间在软件开发中常常遇到。透过运行时间可分析出函数或程序段的运行效率和性能,从而有针对性的对代码进行优化。 在unix环境中,常常用binutils(GNU二进制工

统计函数或某一段代码的运行时间在软件开发中常常遇到。透过运行时间可分析出函数或程序段的运行效率和性能,从而有针对性的对代码进行优化。在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结构体定义:

1struct timeval {
2    time_t      tv_sec;
3    suseconds_t tv_usec;
4};

timezone结构体定义:

1struct timezone {
2    int tz_minuteswest; /* 和Greenwich差了多少分钟 */
3    int tz_dsttime;     /* 日光节约时间的状态 */
4};

上述两个结构体都定义在/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()函数来统计函数或某一段代码的运行时间。

view source

01/*
02 * Test function run time.
03 */
04
05#include <stdio.h>
06#include <sys/time.h>
07
08void func(void)
09{
10    double c = 2.5641321, d = 0.00158;
11    double val = 0.0;
12
13    for (int i = 0; i < 1000000; i++)
14    {
15        val += (c * c) + (d * d) + (2 * c * d);
16    }
17
18    return;
19}
20
21int main(int argc, char **argv)
22{
23    struct timeval tpstart, tpend;
24    float timeuse;
25
26
27    gettimeofday(&tpstart, NULL);
28
29    func();
30
31    gettimeofday(&tpend, NULL);
32    timeuse = 1000000 * (tpend.tv_sec - tpstart.tv_sec) + tpend.tv_usec - tpstart.tv_usec;
33    timeuse /= 1000000;
34
35    printf("Used Time: %f seconds\n", timeuse);
36
37    return  0;
38}

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

责任编辑:linux
首页 | 电气资讯 | 应用技术 | 高压电器 | 电气设计 | 行业应用 | 低压电器 | 电路图 | 关于我们 | 版权声明

Copyright 2017-2018 电气自动化网 版权所有 辽ICP备17010593号-1

电脑版 | 移动版 原创声明:本站大部分内容为原创,转载请注明电气自动化网转载;部分内容来源网络,如侵犯您的权益请发送邮件到[email protected]联系我们删除。