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_windows.h" 90199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger 100199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger//Time 110199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger#define WIN32_LEAN_AND_MEAN 1 120199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger#include <Windows.h> 130199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger 140199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenbergerstatic ULONGLONG winCpuTime() { 150199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger FILETIME createTime; 160199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger FILETIME exitTime; 170199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger FILETIME usrTime; 180199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger FILETIME sysTime; 190199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger if (0 == GetProcessTimes(GetCurrentProcess() 200199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger , &createTime, &exitTime 210199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger , &sysTime, &usrTime)) 220199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger { 230199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger return 0; 240199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger } 250199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger ULARGE_INTEGER start_cpu_sys; 260199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger ULARGE_INTEGER start_cpu_usr; 270199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger start_cpu_sys.LowPart = sysTime.dwLowDateTime; 280199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger start_cpu_sys.HighPart = sysTime.dwHighDateTime; 290199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger start_cpu_usr.LowPart = usrTime.dwLowDateTime; 300199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger start_cpu_usr.HighPart = usrTime.dwHighDateTime; 310199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger return start_cpu_sys.QuadPart + start_cpu_usr.QuadPart; 320199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger} 330199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger 340199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenbergervoid BenchSysTimer::startWall() { 350199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger if (0 == ::QueryPerformanceCounter(&this->fStartWall)) { 360199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger this->fStartWall.QuadPart = 0; 370199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger } 380199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger} 390199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenbergervoid BenchSysTimer::startCpu() { 400199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger this->fStartCpu = winCpuTime(); 410199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger} 420199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger 430199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenbergerdouble BenchSysTimer::endCpu() { 440199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger ULONGLONG end_cpu = winCpuTime(); 451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return static_cast<double>((end_cpu - this->fStartCpu)) / 10000.0L; 460199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger} 470199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenbergerdouble BenchSysTimer::endWall() { 480199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger LARGE_INTEGER end_wall; 490199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger if (0 == ::QueryPerformanceCounter(&end_wall)) { 500199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger end_wall.QuadPart = 0; 510199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger } 520199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger 530199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger LARGE_INTEGER ticks_elapsed; 540199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger ticks_elapsed.QuadPart = end_wall.QuadPart - this->fStartWall.QuadPart; 550199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger 560199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger LARGE_INTEGER frequency; 570199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger if (0 == ::QueryPerformanceFrequency(&frequency)) { 581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return 0.0L; 590199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger } else { 601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger return static_cast<double>(ticks_elapsed.QuadPart) 611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger / static_cast<double>(frequency.QuadPart) 621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * 1000.0L; 630199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger } 640199fa7423f89a129da2b22a488f2c18e2e4727fDerek Sollenberger} 65