1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//===================================================== 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// File : portable_timer.hh 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Author : L. Plagne <laurent.plagne@edf.fr)> from boost lib 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) EDF R&D, lun sep 30 14:23:17 CEST 2002 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath//===================================================== 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This program is free software; you can redistribute it and/or 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// modify it under the terms of the GNU General Public License 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// as published by the Free Software Foundation; either version 2 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// of the License, or (at your option) any later version. 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This program is distributed in the hope that it will be useful, 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// but WITHOUT ANY WARRANTY; without even the implied warranty of 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// GNU General Public License for more details. 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// You should have received a copy of the GNU General Public License 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// along with this program; if not, write to the Free Software 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// simple_time extracted from the boost library 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef _PORTABLE_TIMER_HH 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define _PORTABLE_TIMER_HH 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <ctime> 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <cstdlib> 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <time.h> 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define USEC_IN_SEC 1000000 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// timer -------------------------------------------------------------------// 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// A timer object measures CPU time. 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef _MSC_VER 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define NOMINMAX 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <windows.h> 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/*#ifndef hr_timer 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "hr_time.h" 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define hr_timer 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif*/ 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath class Portable_Timer 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef struct { 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LARGE_INTEGER start; 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LARGE_INTEGER stop; 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } stopWatch; 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Portable_Timer() 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath startVal.QuadPart = 0; 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath stopVal.QuadPart = 0; 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath QueryPerformanceFrequency(&frequency); 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void start() { QueryPerformanceCounter(&startVal); } 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void stop() { QueryPerformanceCounter(&stopVal); } 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath double elapsed() { 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LARGE_INTEGER time; 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath time.QuadPart = stopVal.QuadPart - startVal.QuadPart; 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return LIToSecs(time); 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath double user_time() { return elapsed(); } 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath private: 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath double LIToSecs(LARGE_INTEGER& L) { 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return ((double)L.QuadPart /(double)frequency.QuadPart) ; 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LARGE_INTEGER startVal; 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LARGE_INTEGER stopVal; 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LARGE_INTEGER frequency; 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; // Portable_Timer 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <sys/time.h> 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <sys/resource.h> 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <unistd.h> 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <sys/times.h> 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathclass Portable_Timer 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Portable_Timer() 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_clkid = BtlConfig::Instance.realclock ? CLOCK_REALTIME : CLOCK_PROCESS_CPUTIME_ID; 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Portable_Timer(int clkid) : m_clkid(clkid) 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath {} 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void start() 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath timespec ts; 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath clock_gettime(m_clkid, &ts); 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_start_time = double(ts.tv_sec) + 1e-9 * double(ts.tv_nsec); 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void stop() 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath timespec ts; 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath clock_gettime(m_clkid, &ts); 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_stop_time = double(ts.tv_sec) + 1e-9 * double(ts.tv_nsec); 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath double elapsed() 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return user_time(); 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath double user_time() 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_stop_time - m_start_time; 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathprivate: 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath int m_clkid; 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath double m_stop_time, m_start_time; 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; // Portable_Timer 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // PORTABLE_TIMER_HPP 146