计算一个程序的运行时间

clock()

 

CLOCK计时函数
clock()是C/C++中的计时函数,而与其相关的 数据类型是clock_t。在MSDN中,查得对clock函数定义如下:
clock_t clock(void) ;
简单而言,就是该程序从启动到函数调用占用CPU的时间。这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock);若挂钟时间不可取,则返回-1。其中clock_t是用来保存时间的 数据类型,在time.h文件中,我们可以找到对它的定义:
#ifndef _CLOCK_T_DEFINED
typedef long clock_t;
#define _CLOCK_T_DEFINED
#endif
很明显,clock_t是一个长整形数。在time.h文件中,还定义了一个 常量 CLOCKS_PER_SEC,它用来表示一秒钟会有多少个时钟计时单元,其定义如下:
#define CLOCKS_PER_SEC ((clock_t)1000)
在linux系统下,CLOCKS_PER_SEC的值可能有所不同,目前使用的linux打印出来的值是1000000,表示的是微妙。这一点需要注意。
可以看到每过千分之一秒(1毫秒),调用clock()函数返回的值就加1。下面举个例子,你可以使用公式clock()/CLOCKS_PER_SEC来计算一个进程自身的运行时间:
void elapsed_time()
{
printf("Elapsed time:%u secs.\n",clock()/CLOCKS_PER_SEC);
}
当然,你也可以用clock函数来计算你的机器运行一个循环或者处理其它事件到底花了多少时间:
#include <stdio.h>
#include < stdlib.h>
#include <time.h>
int main(void)
{
long i = 10000000L;
clock_t start, finish;
double duration;
/* 测量一个事件持续的时间*/
printf( "Time to do %ld empty loops is ", i) ;
start = clock();
while( i-- );
finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC;
printf( "%f seconds\n", duration );
system("pause");
return 0;
}
在笔者的机器上,运行结果如下:
Time to do 10000000 empty loops is 0.03000 seconds
上面我们看到时钟计时单元的长度为1毫秒,那么计时的精度也为1毫秒,那么我们可不可以通过改变CLOCKS_PER_SEC的定义,通过把它定义的大一些,从而使计时精度更高呢?通过尝试,你会发现这样是不行的。在标准C/C++中,最小的计时单位是一毫秒。
 
 
 
C++获取当前时间和计算程序运行时间的方法
 
获取当前时间:
 

#include<iostream>
#include<Windows.h>
 
using namespace std;
 
int main()

  SYSTEMTIME sys;
  GetLocalTime(&sys);
  cout<<sys.wYear<<"年";
  cout<<sys.wMonth<<"月";
  cout<<sys.wDay<<"日";
  cout<<sys.wHour<<"时";
  cout<<sys.wMinute<<"分";
  cout<<sys.wSecond<<"秒";
  cout<<sys.wMilliseconds<<"毫秒"; 
  cout<<",星期"<<sys.wDayOfWeek<<endl;
 
 system("pause");
 return 0;

 

计算程序运行时间 方法一

#include<iostream>
#include<time.h>//关键

using namespace std;
 
int main()

  clock_t start, finish;
  double totalTime;
  start = clock(); 
 
  //需要测试运行时间的代码段放在这
 
 
  finish = clock();
  totalTime = (double)(finish - start);
 
  cout<<"花费"<<totalTime<<"毫秒"<<endl;
 
  system("pause");
  return 0;

 

计算程序运行时间 方法二

#include<iostream>
#include<Windows.h>//关键
 
using namespace std;
 
int main()

  LONGLONG start, finish;
   //long long  start, finish;这样是可行的
  LONGLONG totalTime;
  start = GetTickCount();
 
   //需要测试运行时间的代码段放在这
 
  finish = GetTickCount();
  totalTime = finish - start; 
  cout<<"花费"<<totalTime<<"毫秒"<<endl;
 
  system("pause");
  return 0;

http://wenku.baidu.com/view/a1a68fd0195f312b3169a5c4.html

 

 

QueryPerformanceFrequency() - 基本介绍

QueryPerformanceFrequency() - 基本介绍

类型:Win32API

原型:BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

作用:返回硬件支持的高精度计数器的频率。

返回值:非零,硬件支持高精度计数器;零,硬件不支持,读取失败。

QueryPerformanceFrequency() - 技术特点

供WIN9X使用的高精度定时器:QueryPerformanceFrequency()和QueryPerformanceCounter(),要求计算机从硬件上支持高精度定时器。

函数的原形是:
  BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);
  BOOL QueryPerformanceCounter (LARGE_INTEGER *lpCount);

数据类型LARGEINTEGER既可以是一个作为8字节长的整数,也可以是作为两个4字节长的整数的联合结构,其具体用法根据编译器是否支持64位而定。该类型的定义如下:
  typeef union _ LARGE_INTEGER
  {
   struct
   {
   DWORD LowPart;
   LONG HighPart;
   };
   LONGLONG QuadPart;
  } LARGE_INTEGER;

在定时前应该先调用QueryPerformanceFrequency()函数获得机器内部计时器的时钟频率。接着在需要严格计时的事件发生前和发生之后分别调用QueryPerformanceCounter(),利用两次获得的计数之差和时钟频率,就可以计算出事件经历的精确时间。测试函数SLEEP(100)的精确持续时间方法:
  LARGE_INTEGER litmp;
  LONGLONG qt1,qt2;
  double dft,dff,dfm;
  QueryPerformanceFrequency(&litmp);//获得时钟频率
  dff=(double)litmp.QuadPart;
  QueryPerformanceCounter(&litmp);//获得初始值
  qt1=litmp.QuadPart;Sleep(100);
  QueryPerformanceCounter(&litmp);//获得终止值
  qt2=litmp.QuadPart;
  dfm=(double)(qt2-qt1);
  dft=dfm/dff;//获得对应的时间值

需要注意的是DFT计算的结果单位是秒。

 

#include <windows.h>
#include <ctime>
#include <iostream>
using namespace std;

extern void test_microseconds()
{LARGE_INTEGER litmp;
 LONGLONG qt1, qt2;
 double dft, dff, dfm;
 clock_t st, et;
 QueryPerformanceFrequency(&litmp);//获得时钟频率
 dff = (double) litmp.QuadPart;
 
// while (1)
   {QueryPerformanceCounter(&litmp);//获得初始值
    qt1 = litmp.QuadPart;
    st = clock();
    Sleep(100);
    QueryPerformanceCounter(&litmp);//获得终止值
    qt2 = litmp.QuadPart;
    et = clock();
   
    dfm = (double) (qt2 - qt1);
    dft = dfm / dff;//获得对应的时间值,单位秒
    cout << dfm << " / " << dff << " = " << dft * 1000 << " 毫秒" << endl;
    cout << (et - st) << " 毫秒" << endl;
    }
}


int main(int argc, char* argv[])
{
test_microseconds();
system("pause");
    return 0;
} 加入了毫秒级的clock()进行对比可看出的确精确到了微妙级!

 

http://zhidao.baidu.com/question/166046065

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用系统提供的时间函数来计算程序运行的时间。在程序开始时记录开始时间程序结束时记录结束时间,两者相减即可得到程序运行的时间。在 C 语言中,可以使用 time.h 头文件中的 clock() 函数来获取 CPU 执行的时钟数,再除以 CLOCKS_PER_SEC 得到秒数。示例代码如下: ``` #include <stdio.h> #include <time.h> int main() { clock_t start, end; double cpu_time_used; start = clock(); // 程序运行的代码 end = clock(); cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC; printf("程序运行时间为 %f 秒\n", cpu_time_used); return 0; } ``` ### 回答2: 计算程序运行的时间主要有两种方法:手动计时和使用编程语言提供的计时函数。 一、手动计时方法: 1. 在程序开始执行前,获取当前时间戳作为起始时间。 2. 在程序执行完成后,再次获取当前时间戳作为结束时间。 3. 使用结束时间减去起始时间,得出程序运行的时间差。 4. 可以将时间差转换为秒、毫秒或其他单位,以便更直观地表示程序运行时间。 二、使用编程语言提供的计时函数: 1. 不同编程语言提供的计时函数可能不同,在文档或官方资料中查找相关信息。 2. 一般来说,使用计时函数分为两步:开始计时和结束计时。 3. 在程序开始执行前,调用相应的计时函数,开始计时。 4. 在程序执行完成后,再次调用计时函数,结束计时。 5. 计时函数会返回开始和结束时间之间的时间差。 6. 可以按照需要将时间差转换为其他单位。 值得注意的是,程序运行的时间受多个因素影响,如硬件性能、程序的复杂度等。所以对于性能测试或比较,应该进行多次运行并取平均值以减小误差。另外,为了更加精确计时,可以考虑去除掉程序外部的干扰,如磁盘读写、网络传输等。 ### 回答3: 要计算一个程序运行时间,可以使用以下几种方法: 1. 使用时间戳:程序开始运行前获取当前时间时间戳,然后在程序结束时再次获取时间戳,两个时间戳相减即可得到程序运行的时间。 2. 使用计时器:在程序开始时启动一个计时器,然后在程序结束时停止计时器,计时器所记录的时间即为程序运行的时间。 3. 使用时间函数:在程序的特定位置或关键部分插入时间函数,记录函数执行时间点,然后计算不同时间点之间的时间差,这样可以得到各个部分的执行时间。 4. 使用性能分析工具:可以使用一些性能分析工具来测量程序运行时间,这些工具可以提供更详细的信息,如函数调用树、内存占用等。 需要注意的是,程序运行时间可能受到多种因素的影响,如硬件性能、程序输入的大小等。因此,在进行时间计算的时候,最好进行多次运行并取平均值,以提高计算结果的准确性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值