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; }
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; }
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 */ }
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; }