static void
_dispatch_benchmark_init(void *context)
{
	struct __dispatch_benchmark_data_s *bdata = context;
	// try and simulate performance of real benchmark as much as possible
	// keep 'f', 'c' and 'cnt' in registers
	register void (*f)(void *) = bdata->func;
	register void *c = bdata->ctxt;
	register size_t cnt = bdata->count;
	uint64_t start, delta;
#ifdef __LP64__
	__uint128_t lcost;
#else
	long double lcost;
#endif
	kern_return_t kr;
	size_t i = 0;

	kr = mach_timebase_info(&bdata->tbi);
	dispatch_assert_zero(kr);

	start = mach_absolute_time();
	do {
		i++;
		f(c);
	} while (i < cnt);
	delta = mach_absolute_time() - start;

	lcost = delta;
	lcost *= bdata->tbi.numer;
	lcost /= bdata->tbi.denom;
	lcost /= cnt;

	bdata->loop_cost = lcost;
}
Exemple #2
0
uint64_t
_dispatch_get_nanoseconds(void)
{
	struct timeval now;
	int r = gettimeofday(&now, NULL);
	dispatch_assert_zero(r);
	dispatch_assert(sizeof(NSEC_PER_SEC) == 8);
	dispatch_assert(sizeof(NSEC_PER_USEC) == 8);
	return now.tv_sec * NSEC_PER_SEC + now.tv_usec * NSEC_PER_USEC;
}
Exemple #3
0
uint64_t
_dispatch_get_nanoseconds(void)
{
#if !TARGET_OS_WIN32
	struct timeval now;
	int r = gettimeofday(&now, NULL);
	dispatch_assert_zero(r);
	dispatch_assert(sizeof(NSEC_PER_SEC) == 8);
	dispatch_assert(sizeof(NSEC_PER_USEC) == 8);
	return (uint64_t)now.tv_sec * NSEC_PER_SEC +
			(uint64_t)now.tv_usec * NSEC_PER_USEC;
#else /* TARGET_OS_WIN32 */
	// FILETIME is 100-nanosecond intervals since January 1, 1601 (UTC).
	FILETIME ft;
	ULARGE_INTEGER li;
	GetSystemTimeAsFileTime(&ft);
	li.LowPart = ft.dwLowDateTime;
	li.HighPart = ft.dwHighDateTime;
	return li.QuadPart * 100ull;
#endif /* TARGET_OS_WIN32 */
}
Exemple #4
0
static void
_dispatch_benchmark_init(void *context)
{
	struct __dispatch_benchmark_data_s *bdata = (struct __dispatch_benchmark_data_s *)context;
	// try and simulate performance of real benchmark as much as possible
	// keep 'f', 'c' and 'cnt' in registers
	register void (*f)(void *) = bdata->func;
	register void *c = bdata->ctxt;
	register size_t cnt = bdata->count;
	size_t i = 0;
	uint64_t start, delta;
#if defined(__LP64__) && !defined(_MSC_VER)
	__uint128_t lcost;
#else
	long double lcost;
#endif
#if HAVE_MACH_ABSOLUTE_TIME
	kern_return_t kr;

	kr = mach_timebase_info(&bdata->tbi);
	dispatch_assert_zero(kr);
#endif

	start = _dispatch_absolute_time();
	do {
		i++;
		f(c);
	} while (i < cnt);
	delta = _dispatch_absolute_time() - start;

	lcost = (long double)delta;
#if HAVE_MACH_ABSOLUTE_TIME
	lcost *= bdata->tbi.numer;
	lcost /= bdata->tbi.denom;
#endif
	lcost /= cnt;

	bdata->loop_cost = (uint64_t)lcost;
}