11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger 21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/* 31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2011 Google Inc. 41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file. 71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */ 80199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger#include "BenchSysTimer_mach.h" 90199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger 100199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger//Time 110199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger#include <mach/mach.h> 120199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger#include <mach/mach_time.h> 130199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger 140199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenbergerstatic time_value_t macCpuTime() { 150199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger mach_port_t task = mach_task_self(); 160199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger if (task == MACH_PORT_NULL) { 170199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger time_value_t none = {0, 0}; 180199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger return none; 190199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger } 200199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger 210199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger task_thread_times_info thread_info_data; 220199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger mach_msg_type_number_t thread_info_count = TASK_THREAD_TIMES_INFO_COUNT; 230199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger if (KERN_SUCCESS != task_info(task, 240199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger TASK_THREAD_TIMES_INFO, 250199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger reinterpret_cast<task_info_t>(&thread_info_data), 260199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger &thread_info_count)) 270199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger { 280199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger time_value_t none = {0, 0}; 290199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger return none; 300199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger } 310199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger 320199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger time_value_add(&thread_info_data.user_time, &thread_info_data.system_time) 330199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger return thread_info_data.user_time; 340199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger} 350199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger 360199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenbergerstatic double intervalInMSec(const time_value_t start_clock 370199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger , const time_value_t end_clock) 380199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger{ 390199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger double duration_clock; 400199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger if ((end_clock.microseconds - start_clock.microseconds) < 0) { 410199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger duration_clock = (end_clock.seconds - start_clock.seconds-1)*1000; 420199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger duration_clock += (1000000 430199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger + end_clock.microseconds 440199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger - start_clock.microseconds) / 1000.0; 450199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger } else { 460199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger duration_clock = (end_clock.seconds - start_clock.seconds)*1000; 470199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger duration_clock += (end_clock.microseconds - start_clock.microseconds) 480199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger / 1000.0; 490199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger } 500199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger return duration_clock; 510199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger} 520199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger 530199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenbergervoid BenchSysTimer::startWall() { 540199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger this->fStartWall = mach_absolute_time(); 550199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger} 560199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenbergervoid BenchSysTimer::startCpu() { 570199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger this->fStartCpu = macCpuTime(); 580199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger} 590199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger 600199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenbergerdouble BenchSysTimer::endCpu() { 610199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger time_value_t end_cpu = macCpuTime(); 620199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger return intervalInMSec(this->fStartCpu, end_cpu); 630199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger} 640199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenbergerdouble BenchSysTimer::endWall() { 650199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger uint64_t end_wall = mach_absolute_time(); 660199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger 670199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger uint64_t elapsed = end_wall - this->fStartWall; 680199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger mach_timebase_info_data_t sTimebaseInfo; 690199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger if (KERN_SUCCESS != mach_timebase_info(&sTimebaseInfo)) { 700199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger return 0; 710199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger } else { 720199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger uint64_t elapsedNano = elapsed * sTimebaseInfo.numer 730199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger / sTimebaseInfo.denom; 740199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger return elapsedNano / 1000000; 750199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger } 760199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger} 77