diff options
-rw-r--r-- | src/sysinfo.cc | 37 |
1 files changed, 16 insertions, 21 deletions
diff --git a/src/sysinfo.cc b/src/sysinfo.cc index 4869472..dd1e663 100644 --- a/src/sysinfo.cc +++ b/src/sysinfo.cc @@ -280,29 +280,24 @@ void InitializeSystemInfo() { // group #elif defined BENCHMARK_OS_MACOSX - // returning "mach time units" per second. the current number of elapsed - // mach time units can be found by calling uint64 mach_absolute_time(); - // while not as precise as actual CPU cycles, it is accurate in the face - // of CPU frequency scaling and multi-cpu/core machines. - // Our mac users have these types of machines, and accuracy - // (i.e. correctness) trumps precision. - // See cycleclock.h: CycleClock::Now(), which returns number of mach time - // units on Mac OS X. - mach_timebase_info_data_t timebase_info; - mach_timebase_info(&timebase_info); - double mach_time_units_per_nanosecond = - static_cast<double>(timebase_info.denom) / - static_cast<double>(timebase_info.numer); - cpuinfo_cycles_per_second = mach_time_units_per_nanosecond * 1e9; - - int num_cpus = 0; + int32_t num_cpus = 0; size_t size = sizeof(num_cpus); - int numcpus_name[] = {CTL_HW, HW_NCPU}; - if (::sysctl(numcpus_name, arraysize(numcpus_name), &num_cpus, &size, nullptr, - 0) == 0 && - (size == sizeof(num_cpus))) + if (::sysctlbyname("hw.ncpu", &num_cpus, &size, nullptr, 0) == 0 && + (size == sizeof(num_cpus))) { cpuinfo_num_cpus = num_cpus; - + } else { + fprintf(stderr, "%s\n", strerror(errno)); + std::exit(EXIT_FAILURE); + } + int64_t cpu_freq = 0; + size = sizeof(cpu_freq); + if (::sysctlbyname("hw.cpufrequency", &cpu_freq, &size, nullptr, 0) == 0 && + (size == sizeof(cpu_freq))) { + cpuinfo_cycles_per_second = cpu_freq; + } else { + fprintf(stderr, "%s\n", strerror(errno)); + std::exit(EXIT_FAILURE); + } #else // Generic cycles per second counter cpuinfo_cycles_per_second = static_cast<double>(EstimateCyclesPerSecond()); |