times.cpp
上传用户:chinafayin
上传日期:2022-04-05
资源大小:153k
文件大小:3k
源码类别:

并行计算

开发平台:

Visual C++

  1. /*
  2.     FastGrid (formerly AutoGrid)
  3.     Copyright (C) 2009 The Scripps Research Institute. All rights reserved.
  4.     Copyright (C) 2009 Masaryk University. All rights reserved.
  5.     AutoGrid is a Trade Mark of The Scripps Research Institute.
  6.     This program is free software; you can redistribute it and/or
  7.     modify it under the terms of the GNU General Public License
  8.     as published by the Free Software Foundation; either version 2
  9.     of the License, or (at your option) any later version.
  10.     This program is distributed in the hope that it will be useful,
  11.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.     GNU General Public License for more details.
  14.     You should have received a copy of the GNU General Public License
  15.     along with this program; if not, write to the Free Software
  16.     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  17. */
  18. #if !defined(_WIN32)
  19.     #include <unistd.h>
  20.     #include <cstdio>
  21.     #include "Exceptions.h"
  22. #endif
  23. #include "times.h"
  24. int getClocksPerSec()
  25. {
  26. #if defined(_WIN32)
  27.     return CLOCKS_PER_SEC;
  28. #else
  29.     int clocks = sysconf(_SC_CLK_TCK);
  30.     if (clocks < 0)
  31.     {
  32.         fprintf(stderr, ""sysconf(_SC_CLK_TCK)" failed in getClocksPerSec()n");
  33.         throw ExitProgram(-1);
  34.     }
  35.     return clocks;
  36. #endif
  37. }
  38. #if defined(_WIN32)
  39. #define WIN32_LEAN_AND_MEAN
  40. #include <windows.h>
  41. #include <cerrno>
  42. // converts WinAPI's FILETIME to clock_t
  43. static clock_t FileTimeToClockTime(unsigned long long fileTime)
  44. {
  45.     // fileTime contains the time in 100s of nanoseconds
  46.     return clock_t((fileTime * CLOCKS_PER_SEC) / 10000000ull);
  47. }
  48. // there is no times(..) function on Windows so we have to implement it ourselves
  49. clock_t times(tms *buffer)
  50. {
  51.     if (!buffer)
  52.     {
  53.         _set_errno(EFAULT);
  54.         return clock_t(-1);
  55.     }
  56.     unsigned long long creationTime, exitTime, kernelTime, userTime;
  57.     GetProcessTimes(GetCurrentProcess(),
  58.                     reinterpret_cast<FILETIME*>(&creationTime),
  59.                     reinterpret_cast<FILETIME*>(&exitTime),
  60.                     reinterpret_cast<FILETIME*>(&kernelTime),
  61.                     reinterpret_cast<FILETIME*>(&userTime));
  62.     // Fill in the tms structure
  63.     buffer->tms_cstime = 0; // We do not use these two anyway
  64.     buffer->tms_cutime = 0;
  65.     buffer->tms_stime = FileTimeToClockTime(kernelTime);
  66.     buffer->tms_utime = FileTimeToClockTime(userTime);
  67.     // Use the high-resolution performance counter.
  68.     // The drawback is that we cannot let this thread switch between
  69.     // individual processors because that would give us incorrect values.
  70.     // This can be solved by calling SetThreadAffinityMask at the start
  71.     // of the program in case times(..) is invoked from the main thread
  72.     // only. The InitWinSetup class takes care of that.
  73.     unsigned long long freq, time;
  74.     QueryPerformanceFrequency(reinterpret_cast<LARGE_INTEGER*>(&freq));
  75.     QueryPerformanceCounter(reinterpret_cast<LARGE_INTEGER*>(&time));
  76.     clock_t ret = clock_t((time * CLOCKS_PER_SEC) / (freq? freq : 1));
  77.     return ret;
  78. }
  79. class InitWinSetup
  80. {
  81. public:
  82.     InitWinSetup()
  83.     {
  84.         // Bound this thread to the first CPU
  85.         SetThreadAffinityMask(GetCurrentThread(), 1);
  86.         // Raise the process priority
  87.         //SetPriorityClass(GetCurrentProcess(), ABOVE_NORMAL_PRIORITY_CLASS);
  88.         SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
  89.     }
  90. };
  91. static InitWinSetup winSetup;
  92. #endif