1 # -*- coding: iso-8859-1 -*-
2 # Copyright (C) 2023 CEA, EDF
4 # This library is free software; you can redistribute it and/or
5 # modify it under the terms of the GNU Lesser General Public
6 # License as published by the Free Software Foundation; either
7 # version 2.1 of the License, or (at your option) any later version.
9 # This library is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 # Lesser General Public License for more details.
14 # You should have received a copy of the GNU Lesser General Public
15 # License along with this library; if not, write to the Free Software
16 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 # See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
21 from collections import defaultdict
25 def GetRepresentationOfTimeDelta(cls,endTime, startTime):
26 if endTime is None and startTime is None:
28 td = endTime - startTime
30 ts_of_td = time.gmtime(td.total_seconds())
31 return "{}.{:06d}".format(time.strftime("%H:%M:%S",ts_of_td),td.microseconds)
34 def MemRepr(cls,memInByte):
36 UNITS=["B","kB","MB","GB"]
39 for i in range( len(UNITS) ):
41 oss = "{:03d}".format( int( (remain/1024)*1000 ) )
42 oss = "{}.{} {}".format(m,oss,UNITS[i])
48 return "{} {}".format(m,UNITS[3])
51 self._cpu_mem_during_exec = None
52 self._start_exec_time = None
53 self._end_exec_time = None
54 self._start_input_time = None
55 self._end_input_time = None
56 self._start_output_time = None
57 self._end_output_time = None
59 self._input_hdd_mem = None
61 self._output_hdd_mem = None
64 def CPUMemDuringExec(self):
65 return self._cpu_mem_during_exec
67 @CPUMemDuringExec.setter
68 def CPUMemDuringExec(self,value):
69 self._cpu_mem_during_exec = value
72 def CPUMemDuringExecStr(self):
73 cpu = self._cpu_mem_during_exec[::2]
74 mem_rss = self._cpu_mem_during_exec[1::2]
75 return [(a,ScriptExecInfo.MemRepr(b)) for a,b in self._cpu_mem_during_exec]
79 return self._input_mem
82 def inputMem(self,value):
83 self._input_mem = value
86 def inputMemStr(self):
87 return ScriptExecInfo.MemRepr( self.inputMem )
91 return self._output_mem
94 def outputMem(self,value):
95 self._output_mem = value
98 def outputMemStr(self):
99 return ScriptExecInfo.MemRepr( self.outputMem )
102 def inputHDDMem(self):
103 return self._input_hdd_mem
106 def inputHDDMem(self,value):
107 self._input_hdd_mem = value
110 def inputHDDMemStr(self):
111 if self._input_hdd_mem is None:
112 return "not computed"
113 return " ".join( [ ScriptExecInfo.MemRepr( elt.getSizeOfFileRead() ) for elt in self._input_hdd_mem] )
116 def outputHDDMem(self):
117 return self._output_hdd_mem
120 def outputHDDMem(self,value):
121 self._output_hdd_mem = value
124 def outputHDDMemStr(self):
125 if self._output_hdd_mem is None:
126 return "not computed"
127 return " ".join( [ ScriptExecInfo.MemRepr( elt.getSizeOfFileRead() ) for elt in self._output_hdd_mem] )
130 def startInputTime(self):
131 return self._start_input_time
133 @startInputTime.setter
134 def startInputTime(self,value):
135 self._start_input_time = value
138 def endInputTime(self):
139 return self._end_input_time
142 def endInputTime(self,value):
143 self._end_input_time = value
146 def startExecTime(self):
147 return self._start_exec_time
149 @startExecTime.setter
150 def startExecTime(self,value):
151 self._start_exec_time = value
154 def endExecTime(self):
155 return self._end_exec_time
158 def endExecTime(self,value):
159 self._end_exec_time = value
162 def startOutputTime(self):
163 return self._start_output_time
165 @startOutputTime.setter
166 def startOutputTime(self,value):
167 self._start_output_time = value
170 def endOutputTime(self):
171 return self._end_output_time
173 @endOutputTime.setter
174 def endOutputTime(self,value):
175 self._end_output_time = value
178 def execTimeStr(self):
179 return ScriptExecInfo.GetRepresentationOfTimeDelta(self.endExecTime,self.startExecTime)
182 def inputTimeStr(self):
183 return ScriptExecInfo.GetRepresentationOfTimeDelta(self.endInputTime,self.startInputTime)
186 def outputTimeStr(self):
187 return ScriptExecInfo.GetRepresentationOfTimeDelta(self.endOutputTime,self.startOutputTime)
190 return """start exec time = {self.startExecTime}
191 end exec time = {self.endExecTime}
192 exec_time = {self.execTimeStr}
193 CPU and mem monitoring = {self.CPUMemDuringExecStr}
194 input unpickling and ev load from disk time = {self.inputTimeStr}
195 output serialization and ev write to disk time = {self.outputTimeStr}
196 input memory size before exec (MemoryPeak 2x) = {self.inputMemStr}
197 input memory size from HDD = {self.inputHDDMemStr}
198 output memory size after exec (MemoryPeak 2x) = {self.outputMemStr}
199 output memory size from HDD = {self.outputHDDMemStr}""".format(**locals())
202 def __init__(self, nodeName):
203 self._node_name = nodeName
205 self._exec = defaultdict(ScriptExecInfo)
213 return self._node_name
220 def code(self,value):
224 return """code = {self.code}\nexecs = {self.execs}""".format(**locals())
227 return """ScriptInfo \"{self.nodeName}\"""".format(**locals())
229 from abc import ABC, abstractmethod
231 class InOutputObjVisitorAbstract(ABC):
237 self._cur_obj = ObjMemModel()
241 self._data.append( self._cur_obj )
244 def getSizeOfFileRead(self):
245 return sum( [elt.getSizeOfFileRead() for elt in self._data] )
250 def setHDDMem(self, v):
253 def setFileName(self, fileName):
260 class InOutputObjVisitorIter:
261 def __init__(self, visitor):
262 self._visitor = visitor
266 if self._current >= len(self._visitor._data):
269 ret = self._visitor._data[ self._current ]
273 class InOutputObjVisitor(InOutputObjVisitorAbstract):
278 return self.getSizeOfFileRead()
281 return InOutputObjVisitorIter(self)
283 class ObjMemModel(InOutputObjVisitorAbstract):
287 self._file_name = None
289 def setHDDMem(self, v):
293 def setFileName(self, fileName):
294 self._file_name = fileName
297 def getSizeOfFileRead(self):
298 if hasattr(self,"_data"):
299 return super().getSizeOfFileRead()
304 return self.getSizeOfFileRead()
306 class FakeObjVisitor:
307 def setHDDMem(self, v):
313 class InOutputObjVisitorCM:
314 def __init__(self, visitor):
315 self._visitor = visitor
318 r = self._visitor.enter()
321 return FakeObjVisitor()
322 def __exit__(self,exctype, exc, tb):
324 self._visitor.leave()