Make profiling a decorator

You can call it before any functions/methods using @utils.profiling()
<-- you can specify the sort order of the results, by default it sorts
by cumulative. It will print the results straight into the Kodi log.
This commit is contained in:
angelblue05 2016-03-17 02:55:00 -05:00
parent 6495ed7aca
commit 0afd338cc7

View file

@ -7,6 +7,7 @@ import inspect
import json import json
import pstats import pstats
import sqlite3 import sqlite3
import StringIO
import os import os
from datetime import datetime, time from datetime import datetime, time
import time import time
@ -266,44 +267,26 @@ def reset():
line1="Database reset has completed, Kodi will now restart to apply the changes.") line1="Database reset has completed, Kodi will now restart to apply the changes.")
xbmc.executebuiltin('RestartApp') xbmc.executebuiltin('RestartApp')
def startProfiling(): def profiling(sortby="cumulative"):
# Will print results to Kodi log
def decorator(func):
def wrapper(*args, **kwargs):
pr = cProfile.Profile() pr = cProfile.Profile()
pr.enable() pr.enable()
result = func(*args, **kwargs)
return pr
def stopProfiling(pr, profileName):
pr.disable() pr.disable()
ps = pstats.Stats(pr)
profiles = xbmc.translatePath("%sprofiles/" s = StringIO.StringIO()
% xbmcaddon.Addon().getAddonInfo('profile')).decode('utf-8') ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
ps.print_stats()
logMsg("EMBY Profiling", s.getvalue(), 1)
if not xbmcvfs.exists(profiles): return result
# Create the profiles folder
xbmcvfs.mkdir(profiles)
timestamp = time.strftime("%Y-%m-%d %H-%M-%S") return wrapper
profile = "%s%s_profile_(%s).tab" % (profiles, profileName, timestamp) return decorator
f = xbmcvfs.File(profile, 'w')
f.write("NumbCalls\tTotalTime\tCumulativeTime\tFunctionName\tFileName\r\n")
for (key, value) in ps.stats.items():
(filename, count, func_name) = key
(ccalls, ncalls, total_time, cumulative_time, callers) = value
try:
f.write(
"%s\t%s\t%s\t%s\t%s\r\n"
% (ncalls, "{:10.4f}".format(total_time),
"{:10.4f}".format(cumulative_time), func_name, filename))
except ValueError:
f.write(
"%s\t%s\t%s\t%s\t%s\r\n"
% (ncalls, "{0}".format(total_time),
"{0}".format(cumulative_time), func_name, filename))
f.close()
def convertdate(date): def convertdate(date):
try: try: