zoukankan      html  css  js  c++  java
  • C语言函数运行时间测试

    摘自:http://cookiebear.info/archives/351

    最近突然有必要测试C语言中各个函数的运行时间,于是就搜索了一下,发现有4种方法可以达成测算程序运行时间的目的。
    它们分别是使用clock, times, gettimeofday, getrusage来实现的。下面就来逐一介绍,并比较它们的优劣点。

    系统测试环境:
    VirtualBox (Ubuntu 9.10)
    gcc version 4.4.1
    libc6 2.10.1-0ubuntu16
    Core Duo T2500 2GMHz

    首先先贴出我测试用的程序吧。
    程序做的处理很简单,就是填写一个1024*1024的矩阵。
    只要修改第11行的定义值,就可以使用不同的测量方法了。

    #include <sys/time.h>
    #include <sys/resource.h>
    #include <unistd.h>
    #include <stdio.h>
    #include <time.h>
    #define TEST_BY_CLOCK           (char)(0x00)
    #define TEST_BY_TIMES           (char)(0x01)
    #define TEST_BY_GETTIMEOFDAY    (char)(0x02)
    #define TEST_BY_GETRUSAGE       (char)(0x03)
    #define TEST_METHOD             (TEST_BY_GETTIMEOFDAY)
    #define COORDINATION_X          (int)(1024)
    #define COORDINATION_Y          (int)(1024)
    static int g_Matrix[COORDINATION_X][COORDINATION_Y];
    double getTimeval()
    {
    	struct rusage stRusage;
    	struct timeval stTimeval;
    	if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)
    	{
    		gettimeofday(&stTimeval, NULL);
    	}
    	else if (TEST_METHOD == TEST_BY_GETRUSAGE)
    		 
    	{
    		getrusage(RUSAGE_SELF, &stRusage);
    		stTimeval = stRusage.ru_utime;
    	}
    	return stTimeval.tv_sec + (double)stTimeval.tv_usec*1E-6;
    }
    int main()
    {
    	int i, j;
    	int n = 0;
    	clock_t clockT1, clockT2;
    	double doubleT1, doubleT2;
    	if (TEST_METHOD == TEST_BY_CLOCK)
    	{
    		clockT1 = clock();
    	}
    	else if (TEST_METHOD == TEST_BY_TIMES)
    	{
    		times(&clockT1);
    	}
    	else if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)
    	{
    		doubleT1 = getTimeval();
    	}
    	else if (TEST_METHOD == TEST_BY_GETRUSAGE)
    	{
    		doubleT1 = getTimeval();
    	}
    	for (i = 0; i < COORDINATION_X; i++)
    	{
    		for (j = 0; j < COORDINATION_Y; j++)
    		{
    			g_Matrix[i][j] = i * j;
    		}
    	}
    	if (TEST_METHOD == TEST_BY_CLOCK)
    	{
    		clockT2 = clock();
    		printf("Time result tested by clock = %10.30f\n",(double)(clockT2 - clockT1)/CLOCKS_PER_SEC);
    	}
    	else if (TEST_METHOD == TEST_BY_TIMES)
    	{
    		times(&clockT2);
    		printf("Time result tested by times = %10.30f\n", (double)(clockT2 - clockT1)/sysconf(_SC_CLK_TCK));
    	}
    	else if (TEST_METHOD == TEST_BY_GETTIMEOFDAY)
    	{
    		doubleT2 = getTimeval();
    		printf("Time result tested by gettimeofday = %10.30f\n",(double)(doubleT2 - doubleT1));
    	}
    	else if (TEST_METHOD == TEST_BY_GETRUSAGE)
    	{
    		doubleT2 = getTimeval();
    		printf("Time result tested by getrusage = %10.70f\n", (double)(doubleT2 - doubleT1));
    	}
    	return 0;
    }


    
    

    使用clock的方法:
    clock是ANSI C的标准库函数,关于这个函数需要说明几点。
    首先,它返回的是CPU耗费在本程序上的时间。也就是说,途中sleep的话,由于CPU资源被释放,那段时间将不被计算在内。
    其次,得到的返回值其实就是耗费在本程序上的CPU时间片的数量,也就是Clock Tick的值。该值必须除以CLOCKS_PER_SEC这个宏值,才能最后得到ss.mmnn格式的运行时间。在POSIX兼容系统中,CLOCKS_PER_SEC的值为1,000,000的,也就是1MHz。
    最后,使用这个函数能达到的精度大约为10ms。

    使用times的方法:
    times的用法基本和clock类似,同样是取得CPU时间片的数量,所不同的是要除以的时间单位值为sysconf(_SC_CLK_TCK)。

    使用gettimeofday的方法:
    用gettimeofday直接提取硬件时钟进行运算,得到的结果的精度相比前两种方法提高了很多。
    但是也正由于它提取硬件时钟的原因,这个方法只能计算程序开始时间和结束时间的差值。而此时系统中如果在运行其他的后台程序,可能会影响到最终结果的值。如果后台繁忙,系统dispatch过多的话,并不能完全真实反映被测量函数的运行时间。

    使用getrusage的方法:
    getrusage得到的是程序对系统资源的占用信息。只要指定了RUSAGE_SELF,就可以得到程序本身运行所占用的系统时间。
    可以说是精度最高的测量方法了。

    自己试用了这四种方法,感觉需要高精度测试的话,getrusage和gettimeofday都可以选择。需要长时间测试的话,clock也是不错的,尤其是考虑到它的通用性。



  • 相关阅读:
    用Python完成一个汇率转换器
    鸿蒙如何用JS开发智能手表App
    鸿蒙如何用JS开发智能手表App
    SAP Spartacus SplitViewComponent Migration 的一个具体例子
    SAP Spartacus B2B 页面 Popover Component 的条件显示逻辑
    SAP Spartacus 升级时关于 schematics 的更新
    SAP Spartacus B2B 页面 Disable 按钮的显示原理
    SAP Spartacus B2B 页面 Disable Confirmation 对话框的显示原理
    通过 Feature Level 动态控制 SAP Spartacus 的页面显示
    SAP Commerce Cloud Build Manifest Components
  • 原文地址:https://www.cnblogs.com/CodeWorkerLiMing/p/12007744.html
Copyright © 2011-2022 走看看