forked from LeenkxTeam/LNXSDK
		
	
		
			
	
	
		
			42 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			42 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								import cProfile
							 | 
						||
| 
								 | 
							
								import os
							 | 
						||
| 
								 | 
							
								import pstats
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import lnx
							 | 
						||
| 
								 | 
							
								from lnx import log, utils
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								if lnx.is_reload(__name__):
							 | 
						||
| 
								 | 
							
								    log = lnx.reload_module(log)
							 | 
						||
| 
								 | 
							
								    utils = lnx.reload_module(utils)
							 | 
						||
| 
								 | 
							
								else:
							 | 
						||
| 
								 | 
							
								    lnx.enable_reload(__name__)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Profile:
							 | 
						||
| 
								 | 
							
								    """Context manager for profiling the enclosed code when the given condition is true.
							 | 
						||
| 
								 | 
							
								    The output file is stored in the SDK directory and can be opened by tools such as SnakeViz.
							 | 
						||
| 
								 | 
							
								    """
							 | 
						||
| 
								 | 
							
								    def __init__(self, filename_out: str, condition: bool):
							 | 
						||
| 
								 | 
							
								        self.filename_out = filename_out
							 | 
						||
| 
								 | 
							
								        self.condition = condition
							 | 
						||
| 
								 | 
							
								        self.pr = cProfile.Profile()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __enter__(self):
							 | 
						||
| 
								 | 
							
								        if self.condition:
							 | 
						||
| 
								 | 
							
								            self.pr.enable()
							 | 
						||
| 
								 | 
							
								            log.debug("Profiling started")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return self
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __exit__(self, exc_type, exc_val, exc_tb):
							 | 
						||
| 
								 | 
							
								        if self.condition:
							 | 
						||
| 
								 | 
							
								            self.pr.disable()
							 | 
						||
| 
								 | 
							
								            log.debug("Profiling finished")
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            profile_path = os.path.join(utils.get_sdk_path(), self.filename_out)
							 | 
						||
| 
								 | 
							
								            with open(profile_path, 'w', encoding="utf-8") as profile_file:
							 | 
						||
| 
								 | 
							
								                stats = pstats.Stats(self.pr, stream=profile_file)
							 | 
						||
| 
								 | 
							
								                stats.dump_stats(profile_path)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return False
							 |