#include #include #include "mppriv.h" #if defined(WIN32) || defined(_WIN32) #include struct timezone { __int32 tz_minuteswest; /* minutes W of Greenwich */ int tz_dsttime; /* type of dst correction */ }; /* * gettimeofday.c * Win32 gettimeofday() replacement * taken from PostgreSQL, according to * https://stackoverflow.com/questions/1676036/what-should-i-use-to-replace-gettimeofday-on-windows * * src/port/gettimeofday.c * * Copyright (c) 2003 SRA, Inc. * Copyright (c) 2003 SKC, Inc. * * Permission to use, copy, modify, and distribute this software and * its documentation for any purpose, without fee, and without a * written agreement is hereby granted, provided that the above * copyright notice and this paragraph and the following two * paragraphs appear in all copies. * * IN NO EVENT SHALL THE AUTHOR BE LIABLE TO ANY PARTY FOR DIRECT, * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING * LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS * DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED * OF THE POSSIBILITY OF SUCH DAMAGE. * * THE AUTHOR SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS * IS" BASIS, AND THE AUTHOR HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, * SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. */ /* FILETIME of Jan 1 1970 00:00:00. */ static const unsigned __int64 epoch = ((unsigned __int64) 116444736000000000ULL); /* * timezone information is stored outside the kernel so tzp isn't used anymore. * * Note: this function is not for Win32 high precision timing purpose. See * elapsed_time(). */ int gettimeofday(struct timeval * tp, struct timezone *tzp) { FILETIME file_time; SYSTEMTIME system_time; ULARGE_INTEGER ularge; GetSystemTime(&system_time); SystemTimeToFileTime(&system_time, &file_time); ularge.LowPart = file_time.dwLowDateTime; ularge.HighPart = file_time.dwHighDateTime; tp->tv_sec = (long) ((ularge.QuadPart - epoch) / 10000000L); tp->tv_usec = (long) (system_time.wMilliseconds * 1000); return 0; } // taken from https://stackoverflow.com/questions/5272470/c-get-cpu-usage-on-linux-and-windows double mp_cputime() { HANDLE hProcess = GetCurrentProcess(); FILETIME ftCreation, ftExit, ftKernel, ftUser; SYSTEMTIME stKernel; SYSTEMTIME stUser; GetProcessTimes(hProcess, &ftCreation, &ftExit, &ftKernel, &ftUser); FileTimeToSystemTime(&ftKernel, &stKernel); FileTimeToSystemTime(&ftUser, &stUser); double kernelModeTime = ((stKernel.wHour * 60.) + stKernel.wMinute * 60.) + stKernel.wSecond * 1. + stKernel.wMilliseconds / 1000.; double userModeTime = ((stUser.wHour * 60.) + stUser.wMinute * 60.) + stUser.wSecond * 1. + stUser.wMilliseconds / 1000.; return kernelModeTime + userModeTime; } long mp_peakrss(void) { return 0; } #else #include #include double mp_cputime(void) { struct rusage r; getrusage(RUSAGE_SELF, &r); return r.ru_utime.tv_sec + r.ru_stime.tv_sec + 1e-6 * (r.ru_utime.tv_usec + r.ru_stime.tv_usec); } long mp_peakrss(void) { struct rusage r; getrusage(RUSAGE_SELF, &r); #ifdef __linux__ return r.ru_maxrss * 1024; #else return r.ru_maxrss; #endif } #endif /* WIN32 || _WIN32 */ double mp_realtime(void) { static double realtime0 = -1.0; struct timeval tp; double t; gettimeofday(&tp, NULL); t = tp.tv_sec + tp.tv_usec * 1e-6; if (realtime0 < 0.0) realtime0 = t; return t - realtime0; } double mp_percent_cpu(void) { return (mp_cputime() + 1e-6) / (mp_realtime() + 1e-6); }