Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // G4Timer class implementation 27 // 28 // Author: P.Kent, 21.08.95 - First implementation 29 // Revision: G.Cosmo, 29.04.97 - Added timings for Windows 30 // -------------------------------------------------------------------- 31 32 #include "G4Timer.hh" 33 #include "G4ios.hh" 34 #include "G4Exception.hh" 35 36 #include <iomanip> 37 38 #if defined(IRIX6_2) 39 # if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE_EXTENDED == 1) 40 # define __vfork vfork 41 # endif 42 #endif 43 44 #ifdef WIN32 45 # include <sys/types.h> 46 # include <windows.h> 47 48 // extract milliseconds time unit 49 G4int sysconf(G4int a) 50 { 51 if(a == _SC_CLK_TCK) 52 return 1000; 53 else 54 return 0; 55 } 56 57 static clock_t filetime2msec(FILETIME* t) 58 { 59 return (clock_t)((((G4float) t->dwHighDateTime) * 429496.7296) + 60 (((G4float) t->dwLowDateTime) * .0001)); 61 } 62 63 clock_t times(struct tms* t) 64 { 65 FILETIME ct = { 0, 0 }, et = { 0, 0 }, st = { 0, 0 }, ut = { 0, 0 }, 66 rt = { 0, 0 }; 67 SYSTEMTIME realtime; 68 69 GetSystemTime(&realtime); 70 SystemTimeToFileTime(&realtime, &rt); // get real time in 10^-9 sec 71 if(t != 0) 72 { 73 GetProcessTimes(GetCurrentProcess(), &ct, &et, &st, &ut); 74 // get process time in 10^-9 sec 75 t->tms_utime = t->tms_cutime = filetime2msec(&ut); 76 t->tms_stime = t->tms_cstime = filetime2msec(&st); 77 } 78 return filetime2msec(&rt); 79 } 80 #endif /* WIN32 */ 81 82 // Print timer status on std::ostream 83 // 84 std::ostream& operator<<(std::ostream& os, const G4Timer& t) 85 { 86 // so fixed doesn't propagate 87 std::stringstream ss; 88 ss << std::fixed; 89 if(t.IsValid()) 90 { 91 ss << "User=" << t.GetUserElapsed() << "s Real=" << t.GetRealElapsed() 92 << "s Sys=" << t.GetSystemElapsed() << "s"; 93 #ifdef G4MULTITHREADED 94 // avoid possible FPE error 95 if(t.GetRealElapsed() > 1.0e-6) 96 { 97 G4double cpu_util = (t.GetUserElapsed() + t.GetSystemElapsed()) / 98 t.GetRealElapsed() * 100.0; 99 ss << std::setprecision(1); 100 ss << " [Cpu=" << std::setprecision(1) << cpu_util << "%]"; 101 } 102 #endif 103 } 104 else 105 { 106 ss << "User=****s Real=****s Sys=****s"; 107 } 108 os << ss.str(); 109 110 return os; 111 } 112 113 G4double G4Timer::GetRealElapsed() const 114 { 115 if(!fValidTimes) 116 { 117 G4Exception("G4Timer::GetRealElapsed()", "InvalidCondition", FatalException, 118 "Timer not stopped or times not recorded!"); 119 } 120 std::chrono::duration<G4double> diff = fEndRealTime - fStartRealTime; 121 return diff.count(); 122 } 123 124 G4double G4Timer::GetSystemElapsed() const 125 { 126 if(!fValidTimes) 127 { 128 G4Exception("G4Timer::GetSystemElapsed()", "InvalidCondition", 129 FatalException, "Timer not stopped or times not recorded!"); 130 } 131 G4double diff = fEndTimes.tms_stime - fStartTimes.tms_stime; 132 return diff / sysconf(_SC_CLK_TCK); 133 } 134 135 G4double G4Timer::GetUserElapsed() const 136 { 137 if(!fValidTimes) 138 { 139 G4Exception("G4Timer::GetUserElapsed()", "InvalidCondition", FatalException, 140 "Timer not stopped or times not recorded"); 141 } 142 G4double diff = fEndTimes.tms_utime - fStartTimes.tms_utime; 143 return diff / sysconf(_SC_CLK_TCK); 144 } 145