📄 timers_b.c
字号:
/*****************************************************//* Various timer routines. *//* Al Aburto, aburto@nosc.mil, 18 Feb 1997 *//* *//* t = dtime() outputs the current time in seconds. *//* Use CAUTION as some of these routines will mess *//* up when timing across the hour mark!!! *//* *//* For timing I use the 'user' time whenever *//* possible. Using 'user+sys' time is a separate *//* issue. *//* *//* Example Usage: *//* [timer options added here] *//* main() *//* { *//* double starttime,benchtime,dtime(); *//* *//* starttime = dtime(); */ /* [routine to time] *//* benchtime = dtime() - starttime; *//* } *//* *//* [timer code below added here] *//*****************************************************//***************************************************************//* Timer options. You MUST uncomment one of the options below *//* or compile, for example, with the '-DUNIX' option. *//***************************************************************//* #define Amiga *//* #define UNIX *//* #define UNIX_Old *//* #define VMS *//* #define BORLAND_C *//* #define MSC *//* #define MAC *//* #define IPSC *//* #define FORTRAN_SEC *//* #define GTODay *//* #define CTimer *//* #define UXPM *//* #define MAC_TMgr *//* #define PARIX *//* #define POSIX *//* #define WIN32 *//* #define POSIX1 *//***********************//*********************************//* Timer code. *//*********************************//*******************//* Amiga dtime() *//*******************/#ifdef Amiga#include <ctype.h>#define HZ 50double dtime(){ double q; struct tt { long days; long minutes; long ticks; } tt; DateStamp(&tt); q = ((double)(tt.ticks + (tt.minutes * 60L * 50L))) / (double)HZ; return q;}#endif/*****************************************************//* UNIX dtime(). This is the preferred UNIX timer. *//* Provided by: Markku Kolkka, mk59200@cc.tut.fi *//* HP-UX Addition by: Bo Thide', bt@irfu.se *//*****************************************************/#ifdef UNIX#include <sys/time.h>#include <sys/resource.h>#ifdef hpux#include <sys/syscall.h>#define getrusage(a,b) syscall(SYS_getrusage,a,b)#endifstruct rusage rusage;double dtime(){ double q; getrusage(RUSAGE_SELF,&rusage); q = (double)(rusage.ru_utime.tv_sec); q = q + (double)(rusage.ru_utime.tv_usec) * 1.0e-06; return q;}#endif/***************************************************//* UNIX_Old dtime(). This is the old UNIX timer. *//* Make sure HZ is properly defined in param.h !! *//***************************************************/#ifdef UNIX_Old#include <sys/types.h>#include <sys/times.h>#include <sys/param.h>#ifndef HZ#define HZ 60#endifstruct tms tms;double dtime(){ double q; times(&tms); q = (double)(tms.tms_utime) / (double)HZ; return q;}#endif/*********************************************************//* VMS dtime() for VMS systems. *//* Provided by: RAMO@uvphys.phys.UVic.CA *//* Some people have run into problems with this timer. *//*********************************************************/#ifdef VMS#include time#ifndef HZ#define HZ 100#endifstruct tbuffer_t { int proc_user_time; int proc_system_time; int child_user_time; int child_system_time; };struct tbuffer_t tms;double dtime(){ double q; times(&tms); q = (double)(tms.proc_user_time) / (double)HZ; return q;}#endif/******************************//* BORLAND C dtime() for DOS *//******************************/#ifdef BORLAND_C#include <ctype.h>#include <dos.h>#include <time.h>#define HZ 100struct time tnow;double dtime(){ double q; gettime(&tnow); q = 60.0 * (double)(tnow.ti_min); q = q + (double)(tnow.ti_sec); q = q + (double)(tnow.ti_hund)/(double)HZ; return q;}#endif/**************************************//* Microsoft C (MSC) dtime() for DOS *//**************************************/#ifdef MSC#include <time.h>#include <ctype.h>#define HZ CLOCKS_PER_SECclock_t tnow;double dtime(){ double q; tnow = clock(); q = (double)tnow / (double)HZ; return q;}#endif/*************************************//* Macintosh (MAC) Think C dtime() *//*************************************/#ifdef MAC#include <time.h>#define HZ 60double dtime(){ double q; q = (double)clock() / (double)HZ; return q;}#endif/************************************************************//* iPSC/860 (IPSC) dtime() for i860. *//* Provided by: Dan Yergeau, yergeau@gloworm.Stanford.EDU *//************************************************************/#ifdef IPSCextern double dclock();double dtime(){ double q; q = dclock(); return q;}#endif/**************************************************//* FORTRAN dtime() for Cray type systems. *//* This is the preferred timer for Cray systems. *//**************************************************/#ifdef FORTRAN_SECfortran double second();double dtime(){ double q; second(&q); return q;}#endif/***********************************************************//* UNICOS C dtime() for Cray UNICOS systems. Don't use *//* unless absolutely necessary as returned time includes *//* 'user+system' time. Provided by: R. Mike Dority, *//* dority@craysea.cray.com *//***********************************************************/#ifdef CTimer#include <time.h>double dtime(){ double q; clock_t clock(void); q = (double)clock() / (double)CLOCKS_PER_SEC; return q;}#endif/********************************************//* Another UNIX timer using gettimeofday(). *//* However, getrusage() is preferred. *//********************************************/#ifdef GTODay#include <sys/time.h>struct timeval tnow;double dtime(){ double q; gettimeofday(&tnow,NULL); q = (double)tnow.tv_sec + (double)tnow.tv_usec * 1.0e-6; return q;}#endif/*****************************************************//* Fujitsu UXP/M timer. *//* Provided by: Mathew Lim, ANUSF, M.Lim@anu.edu.au *//*****************************************************/#ifdef UXPM#include <sys/types.h>#include <sys/timesu.h>struct tmsu rusage;double dtime(){ double q; timesu(&rusage); q = (double)(rusage.tms_utime) * 1.0e-06; return q;}#endif/**********************************************//* Macintosh (MAC_TMgr) Think C dtime() *//* requires Think C Language Extensions or *//* #include <MacHeaders> in the prefix *//* provided by Francis H Schiffer 3rd (fhs) *//* skipschiffer@genie.geis.com *//**********************************************/#ifdef MAC_TMgr#include <Timer.h>#include <stdlib.h>static TMTask mgrTimer;static Boolean mgrInited = false;static double mgrClock;#define RMV_TIMER RmvTime( (QElemPtr)&mgrTimer )#define MAX_TIME 1800000000L/* MAX_TIME limits time between calls to *//* dtime( ) to no more than 30 minutes *//* this limitation could be removed by *//* creating a completion routine to sum *//* 30 minute segments (fhs 1994 feb 9) */static void Remove_timer( ){ RMV_TIMER; mgrInited = false;}double dtime( ){ if( mgrInited ) { RMV_TIMER; mgrClock += (MAX_TIME + mgrTimer.tmCount)*1.0e-6; } else { if( _atexit( &Remove_timer ) == 0 ) mgrInited = true; mgrClock = 0.0; } if ( mgrInited ) { mgrTimer.tmAddr = NULL; mgrTimer.tmCount = 0; mgrTimer.tmWakeUp = 0; mgrTimer.tmReserved = 0; InsTime( (QElemPtr)&mgrTimer ); PrimeTime( (QElemPtr)&mgrTimer, -MAX_TIME ); } return( mgrClock );}#endif/***********************************************************//* Parsytec GCel timer. *//* Provided by: Georg Wambach, gw@informatik.uni-koeln.de *//***********************************************************/#ifdef PARIX#include <sys/time.h>double dtime(){ double q; q = (double) (TimeNowHigh()) / (double) CLK_TCK_HIGH; return q;}#endif/************************************************//* Sun Solaris POSIX dtime() routine *//* Provided by: Case Larsen, CTLarsen.lbl.gov *//************************************************/#ifdef POSIX#include <sys/time.h>#include <sys/resource.h>#include <sys/rusage.h>#ifdef __hpux#include <sys/syscall.h>#endifstruct rusage rusage;double dtime(){ double q; getrusage(RUSAGE_SELF,&rusage); q = (double)(rusage.ru_utime.tv_sec); q = q + (double)(rusage.ru_utime.tv_nsec) * 1.0e-09; return q;}#endif/****************************************************//* Windows NT (32 bit) dtime() routine *//* Provided by: Piers Haken, piersh@microsoft.com *//****************************************************/#ifdef WIN32#include <windows.h>double dtime(void){ double q; q = (double)GetTickCount() * 1.0e-03; return q;}#endif/*****************************************************//* Time according to POSIX.1 - <J.Pelan@qub.ac.uk> *//* Ref: "POSIX Programmer's Guide" O'Reilly & Assoc.*//*****************************************************/#ifdef POSIX1#define _POSIX_SOURCE 1#include <unistd.h>#include <limits.h>#include <sys/times.h>struct tms tms;double dtime(){ double q; times(&tms); q = (double)tms.tms_utime / (double)CLK_TCK; return q;}#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -