Files
hdf5/src/H5timer.c

283 lines
7.4 KiB
C
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* Copyright by The HDF Group. *
* Copyright by the Board of Trustees of the University of Illinois. *
* All rights reserved. *
* *
* This file is part of HDF5. The full HDF5 copyright notice, including *
* terms governing use, modification, and redistribution, is contained in *
* the files COPYING and Copyright.html. COPYING can be found at the root *
* of the source code distribution tree; Copyright.html can be found at the *
* root level of an installed copy of the electronic HDF5 document set and *
* is linked from the top-level documents page. It can also be found at *
* http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have *
* access to either file, you may request a copy from help@hdfgroup.org. *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/*-------------------------------------------------------------------------
*
* Created: H5timer.c
* Aug 21 2006
* Quincey Koziol <koziol@hdfgroup.org>
*
* Purpose: Internal 'timer' routines & support routines.
*
*-------------------------------------------------------------------------
*/
/****************/
/* Module Setup */
/****************/
/***********/
/* Headers */
/***********/
#include "H5private.h" /* Generic Functions */
/* We need this for the struct rusage declaration */
#if defined(H5_HAVE_GETRUSAGE) && defined(H5_HAVE_SYS_RESOURCE_H)
# include <sys/resource.h>
#endif
#if defined(H5_HAVE_GETTIMEOFDAY) && defined(H5_HAVE_SYS_TIME_H)
#include <sys/time.h>
#endif
/****************/
/* Local Macros */
/****************/
/******************/
/* Local Typedefs */
/******************/
/********************/
/* Package Typedefs */
/********************/
/********************/
/* Local Prototypes */
/********************/
/*********************/
/* Package Variables */
/*********************/
/*****************************/
/* Library Private Variables */
/*****************************/
/*******************/
/* Local Variables */
/*******************/
/*-------------------------------------------------------------------------
* Function: H5_timer_reset
*
* Purpose: Resets the timer struct to zero. Use this to reset a timer
* that's being used as an accumulator for summing times.
*
* Return: void
*
* Programmer: Robb Matzke
* Thursday, April 16, 1998
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
void
H5_timer_reset (H5_timer_t *timer)
{
assert (timer);
HDmemset (timer, 0, sizeof *timer);
} /* end H5_timer_reset() */
/*-------------------------------------------------------------------------
* Function: H5_timer_begin
*
* Purpose: Initialize a timer to time something.
*
* Return: void
*
* Programmer: Robb Matzke
* Thursday, April 16, 1998
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
void
H5_timer_begin (H5_timer_t *timer)
{
#ifdef H5_HAVE_GETRUSAGE
struct rusage rusage;
#endif
#ifdef H5_HAVE_GETTIMEOFDAY
struct timeval etime;
#endif
assert (timer);
#ifdef H5_HAVE_GETRUSAGE
HDgetrusage (RUSAGE_SELF, &rusage);
timer->utime = (double)rusage.ru_utime.tv_sec +
((double)rusage.ru_utime.tv_usec / 1e6);
timer->stime = (double)rusage.ru_stime.tv_sec +
((double)rusage.ru_stime.tv_usec / 1e6);
#else
timer->utime = 0.0;
timer->stime = 0.0;
#endif
#ifdef H5_HAVE_GETTIMEOFDAY
HDgettimeofday (&etime, NULL);
timer->etime = (double)etime.tv_sec + ((double)etime.tv_usec / 1e6);
#else
timer->etime = 0.0;
#endif
} /* end H5_timer_begin() */
/*-------------------------------------------------------------------------
* Function: H5_timer_end
*
* Purpose: This function should be called at the end of a timed region.
* The SUM is an optional pointer which will accumulate times.
* TMS is the same struct that was passed to H5_timer_start().
* On return, TMS will contain total times for the timed region.
*
* Return: void
*
* Programmer: Robb Matzke
* Thursday, April 16, 1998
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
void
H5_timer_end (H5_timer_t *sum/*in,out*/, H5_timer_t *timer/*in,out*/)
{
H5_timer_t now;
assert (timer);
H5_timer_begin (&now);
timer->utime = MAX(0.0, now.utime - timer->utime);
timer->stime = MAX(0.0, now.stime - timer->stime);
timer->etime = MAX(0.0, now.etime - timer->etime);
if (sum) {
sum->utime += timer->utime;
sum->stime += timer->stime;
sum->etime += timer->etime;
}
} /* end H5_timer_end() */
/*-------------------------------------------------------------------------
* Function: H5_bandwidth
*
* Purpose: Prints the bandwidth (bytes per second) in a field 10
* characters wide widh four digits of precision like this:
*
* NaN If <=0 seconds
* 1234. TB/s
* 123.4 TB/s
* 12.34 GB/s
* 1.234 MB/s
* 4.000 kB/s
* 1.000 B/s
* 0.000 B/s If NBYTES==0
* 1.2345e-10 For bandwidth less than 1
* 6.7893e+94 For exceptionally large values
* 6.678e+106 For really big values
*
* Return: void
*
* Programmer: Robb Matzke
* Wednesday, August 5, 1998
*
* Modifications:
*
*-------------------------------------------------------------------------
*/
void
H5_bandwidth(char *buf/*out*/, double nbytes, double nseconds)
{
double bw;
if(nseconds <= 0.0)
HDstrcpy(buf, " NaN");
else {
bw = nbytes/nseconds;
if(fabs(bw) < 0.0000000001)
/* That is == 0.0, but direct comparison between floats is bad */
HDstrcpy(buf, "0.000 B/s");
else if(bw < 1.0)
sprintf(buf, "%10.4e", bw);
else if(bw < 1024.0) {
sprintf(buf, "%05.4f", bw);
HDstrcpy(buf+5, " B/s");
} else if(bw < (1024.0 * 1024.0)) {
sprintf(buf, "%05.4f", bw / 1024.0);
HDstrcpy(buf+5, " kB/s");
} else if(bw < (1024.0 * 1024.0 * 1024.0)) {
sprintf(buf, "%05.4f", bw / (1024.0 * 1024.0));
HDstrcpy(buf+5, " MB/s");
} else if(bw < (1024.0 * 1024.0 * 1024.0 * 1024.0)) {
sprintf(buf, "%05.4f", bw / (1024.0 * 1024.0 * 1024.0));
HDstrcpy(buf+5, " GB/s");
} else if(bw < (1024.0 * 1024.0 * 1024.0 * 1024.0 * 1024.0)) {
sprintf(buf, "%05.4f", bw / (1024.0 * 1024.0 * 1024.0 * 1024.0));
HDstrcpy(buf+5, " TB/s");
} else {
sprintf(buf, "%10.4e", bw);
if(HDstrlen(buf) > 10)
sprintf(buf, "%10.3e", bw);
}
}
} /* end H5_bandwidth() */
/*-------------------------------------------------------------------------
* Function: H5_now
*
* Purpose: Retrieves the current time, as seconds after the UNIX epoch.
*
* Return: # of seconds from the epoch (can't fail)
*
* Programmer: Quincey Koziol
* Tuesday, November 28, 2006
*
*-------------------------------------------------------------------------
*/
time_t
H5_now(void)
{
time_t now; /* Current time */
#ifdef H5_HAVE_GETTIMEOFDAY
{
struct timeval now_tv;
HDgettimeofday(&now_tv, NULL);
now = now_tv.tv_sec;
}
#else /* H5_HAVE_GETTIMEOFDAY */
now = HDtime(NULL);
#endif /* H5_HAVE_GETTIMEOFDAY */
return(now);
} /* end H5_now() */