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._start_exec_time = None
52 self._end_exec_time = None
53 self._start_input_time = None
54 self._end_input_time = None
55 self._start_output_time = None
56 self._end_output_time = None
58 self._input_hdd_mem = None
60 self._output_hdd_mem = None
64 return self._input_mem
67 def inputMem(self,value):
68 self._input_mem = value
71 def inputMemStr(self):
72 return ScriptExecInfo.MemRepr( self.inputMem )
76 return self._output_mem
79 def outputMem(self,value):
80 self._output_mem = value
83 def outputMemStr(self):
84 return ScriptExecInfo.MemRepr( self.outputMem )
87 def inputHDDMem(self):
88 return self._input_hdd_mem
91 def inputHDDMem(self,value):
92 self._input_hdd_mem = value
95 def inputHDDMemStr(self):
96 if self._input_hdd_mem is None:
98 return " ".join( [ ScriptExecInfo.MemRepr( elt.getSizeOfFileRead() ) for elt in self._input_hdd_mem] )
101 def outputHDDMem(self):
102 return self._output_hdd_mem
105 def outputHDDMem(self,value):
106 self._output_hdd_mem = value
109 def outputHDDMemStr(self):
110 if self._output_hdd_mem is None:
111 return "not computed"
112 return " ".join( [ ScriptExecInfo.MemRepr( elt.getSizeOfFileRead() ) for elt in self._output_hdd_mem] )
115 def startInputTime(self):
116 return self._start_input_time
118 @startInputTime.setter
119 def startInputTime(self,value):
120 self._start_input_time = value
123 def endInputTime(self):
124 return self._end_input_time
127 def endInputTime(self,value):
128 self._end_input_time = value
131 def startExecTime(self):
132 return self._start_exec_time
134 @startExecTime.setter
135 def startExecTime(self,value):
136 self._start_exec_time = value
139 def endExecTime(self):
140 return self._end_exec_time
143 def endExecTime(self,value):
144 self._end_exec_time = value
147 def startOutputTime(self):
148 return self._start_output_time
150 @startOutputTime.setter
151 def startOutputTime(self,value):
152 self._start_output_time = value
155 def endOutputTime(self):
156 return self._end_output_time
158 @endOutputTime.setter
159 def endOutputTime(self,value):
160 self._end_output_time = value
163 def execTimeStr(self):
164 return ScriptExecInfo.GetRepresentationOfTimeDelta(self.endExecTime,self.startExecTime)
167 def inputTimeStr(self):
168 return ScriptExecInfo.GetRepresentationOfTimeDelta(self.endInputTime,self.startInputTime)
171 def outputTimeStr(self):
172 return ScriptExecInfo.GetRepresentationOfTimeDelta(self.endOutputTime,self.startOutputTime)
175 return """start exec time = {self.startExecTime}
176 end exec time = {self.endExecTime}
177 exec_time = {self.execTimeStr}
178 input unpickling and ev load from disk time = {self.inputTimeStr}
179 output serialization and ev write to disk time = {self.outputTimeStr}
180 input memory size before exec (MemoryPeak 2x) = {self.inputMemStr}
181 input memory size from HDD = {self.inputHDDMemStr}
182 output memory size after exec (MemoryPeak 2x) = {self.outputMemStr}
183 output memory size from HDD = {self.outputHDDMemStr}""".format(**locals())
186 def __init__(self, nodeName):
187 self._node_name = nodeName
189 self._exec = defaultdict(ScriptExecInfo)
197 return self._node_name
204 def code(self,value):
208 return """code = {self.code}\nexecs = {self.execs}""".format(**locals())
211 return """ScriptInfo \"{self.nodeName}\"""".format(**locals())
213 from abc import ABC, abstractmethod
215 class InOutputObjVisitorAbstract(ABC):
221 self._cur_obj = ObjMemModel()
225 self._data.append( self._cur_obj )
228 def getSizeOfFileRead(self):
229 return sum( [elt.getSizeOfFileRead() for elt in self._data] )
234 def setHDDMem(self, v):
237 def setFileName(self, fileName):
244 class InOutputObjVisitorIter:
245 def __init__(self, visitor):
246 self._visitor = visitor
250 if self._current >= len(self._visitor._data):
253 ret = self._visitor._data[ self._current ]
257 class InOutputObjVisitor(InOutputObjVisitorAbstract):
262 return self.getSizeOfFileRead()
265 return InOutputObjVisitorIter(self)
267 class ObjMemModel(InOutputObjVisitorAbstract):
271 self._file_name = None
273 def setHDDMem(self, v):
277 def setFileName(self, fileName):
278 self._file_name = fileName
281 def getSizeOfFileRead(self):
282 if hasattr(self,"_data"):
283 return super().getSizeOfFileRead()
288 return self.getSizeOfFileRead()
290 class FakeObjVisitor:
291 def setHDDMem(self, v):
297 class InOutputObjVisitorCM:
298 def __init__(self, visitor):
299 self._visitor = visitor
302 r = self._visitor.enter()
305 return FakeObjVisitor()
306 def __exit__(self,exctype, exc, tb):
308 self._visitor.leave()