|  |  |  | import time
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class Profiler():
 | 
					
						
							|  |  |  |   def __init__(self, enabled=False):
 | 
					
						
							|  |  |  |     self.enabled = enabled
 | 
					
						
							|  |  |  |     self.cp = {}
 | 
					
						
							|  |  |  |     self.cp_ignored = []
 | 
					
						
							|  |  |  |     self.iter = 0
 | 
					
						
							|  |  |  |     self.start_time = time.time()
 | 
					
						
							|  |  |  |     self.last_time = self.start_time
 | 
					
						
							|  |  |  |     self.tot = 0.
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def reset(self, enabled=False):
 | 
					
						
							|  |  |  |     self.enabled = enabled
 | 
					
						
							|  |  |  |     self.cp = {}
 | 
					
						
							|  |  |  |     self.cp_ignored = []
 | 
					
						
							|  |  |  |     self.iter = 0
 | 
					
						
							|  |  |  |     self.start_time = time.time()
 | 
					
						
							|  |  |  |     self.last_time = self.start_time
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def checkpoint(self, name, ignore=False):
 | 
					
						
							|  |  |  |     # ignore flag needed when benchmarking threads with ratekeeper
 | 
					
						
							|  |  |  |     if not self.enabled:
 | 
					
						
							|  |  |  |       return
 | 
					
						
							|  |  |  |     tt = time.time()
 | 
					
						
							|  |  |  |     if name not in self.cp:
 | 
					
						
							|  |  |  |       self.cp[name] = 0.
 | 
					
						
							|  |  |  |       if ignore:
 | 
					
						
							|  |  |  |         self.cp_ignored.append(name)
 | 
					
						
							|  |  |  |     self.cp[name] += tt - self.last_time
 | 
					
						
							|  |  |  |     if not ignore:
 | 
					
						
							|  |  |  |       self.tot += tt - self.last_time
 | 
					
						
							|  |  |  |     self.last_time = tt
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def display(self):
 | 
					
						
							|  |  |  |     if not self.enabled:
 | 
					
						
							|  |  |  |       return
 | 
					
						
							|  |  |  |     self.iter += 1
 | 
					
						
							|  |  |  |     print("******* Profiling %d *******" % self.iter)
 | 
					
						
							|  |  |  |     for n, ms in sorted(self.cp.items(), key=lambda x: -x[1]):
 | 
					
						
							|  |  |  |       if n in self.cp_ignored:
 | 
					
						
							|  |  |  |         print("%30s: %9.2f  avg: %7.2f  percent: %3.0f   IGNORED" % (n, ms*1000.0, ms*1000.0/self.iter, ms/self.tot*100))
 | 
					
						
							|  |  |  |       else:
 | 
					
						
							|  |  |  |         print("%30s: %9.2f  avg: %7.2f  percent: %3.0f" % (n, ms*1000.0, ms*1000.0/self.iter, ms/self.tot*100))
 | 
					
						
							|  |  |  |     print(f"Iter clock: {self.tot / self.iter:2.6f}   TOTAL: {self.tot:2.2f}")
 |