cputime.h   [plain text]


/*
 * Copyright (c) 2003 Apple Computer, Inc. All Rights Reserved.
 * 
 * The contents of this file constitute Original Code as defined in and are
 * subject to the Apple Public Source License Version 1.2 (the 'License').
 * You may not use this file except in compliance with the License. Please 
 * obtain a copy of the License at http://www.apple.com/publicsource and 
 * read it before using this file.
 * 
 * This Original Code and all software distributed under the License are
 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 
 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
 * Please see the License for the specific language governing rights and 
 * limitations under the License.
 */

/*
 * cputime.h - high resolution timing module
 *
 * This module uses a highly machine-dependent mechanism to get timestamps
 * directly from CPU registers, without the overhead of a system call. The
 * timestamps are exported as type CPUTime and you should not concern yourself
 * with exactly what that is. 
 *
 * We provide routines to convert a difference between two CPUTimes as a double,
 * in seconds, milliseconds, and microseconds. Th
 *
 * The cost (time) of getting a timestamp (via CPUTimeRead()) generally takes
 * two or fewer times the resolution period, i.e., less than 80 ns on a 100 MHz
 * bus machine, often 40 ns.
 * 
 * The general usage of this module is as follows:
 *
 * {
 *		set up test scenario;
 *		CPUTime startTime = CPUTimeRead();
 *		...critical timed code here...
 *		CPUTime endTime = CPUTimeRead();
 * 		double elapsedMilliseconds = CPUTimeDeltaMs(startTime, endTime);
 * }
 *
 * It's crucial to place the CPUTimeDelta*() call OUTSIDE of the critical timed
 * area. It's really cheap to snag the timestamps, but it's not at all cheap
 * to convert the difference between two timestamps to a double. 
 */
 
#ifndef	_CPUTIME_H_
#define _CPUTIME_H_

#ifdef __cplusplus
extern "C" {
#endif

#include <mach/mach_time.h>


typedef uint64_t CPUTime;

/*
 * Obtain machine-dependent, high resolution, cheap-to-read timestamp.
 */
#define CPUTimeRead() mach_absolute_time()

/*
 * Convert difference between two CPUTimes into various units.
 * Implemented as separate functions to preserve as much precision as possible
 * before required machine-dependent "divide by clock frequency".
 */
extern double CPUTimeDeltaSec(CPUTime from, CPUTime to);	// seconds
extern double CPUTimeDeltaMs(CPUTime from, CPUTime to);		// milliseconds
extern double CPUTimeDeltaUs(CPUTime from, CPUTime to);		// microseconds

/*
 * Calculate the average of an array of doubles. The lowest and highest values
 * are discarded if there are more than two samples. Typically used to get an
 * average of a set of values returned from CPUTimeDelta*().
 */
double CPUTimeAvg(
	const double *array,
	unsigned arraySize);

#ifdef __cplusplus
}
#endif

#endif	/* _CPUTIME_H_ */