Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/global/management/src/G4Timer.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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