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