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
|