armory/blender/arm/profiler.py

43 lines
1.2 KiB
Python

import cProfile
import os
import pstats
import arm
import arm.log as log
import arm.utils as utils
if arm.is_reload(__name__):
log = arm.reload_module(log)
utils = arm.reload_module(utils)
else:
arm.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') as profile_file:
stats = pstats.Stats(self.pr, stream=profile_file)
stats.dump_stats(profile_path)
return False