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:
parent
6495ed7aca
commit
0afd338cc7
1 changed files with 18 additions and 35 deletions
|
@ -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()
|
|
||||||
|
|
||||||
return pr
|
pr.enable()
|
||||||
|
result = func(*args, **kwargs)
|
||||||
|
pr.disable()
|
||||||
|
|
||||||
def stopProfiling(pr, profileName):
|
s = StringIO.StringIO()
|
||||||
|
ps = pstats.Stats(pr, stream=s).sort_stats(sortby)
|
||||||
|
ps.print_stats()
|
||||||
|
logMsg("EMBY Profiling", s.getvalue(), 1)
|
||||||
|
|
||||||
pr.disable()
|
return result
|
||||||
ps = pstats.Stats(pr)
|
|
||||||
|
|
||||||
profiles = xbmc.translatePath("%sprofiles/"
|
return wrapper
|
||||||
% xbmcaddon.Addon().getAddonInfo('profile')).decode('utf-8')
|
return decorator
|
||||||
|
|
||||||
if not xbmcvfs.exists(profiles):
|
|
||||||
# Create the profiles folder
|
|
||||||
xbmcvfs.mkdir(profiles)
|
|
||||||
|
|
||||||
timestamp = time.strftime("%Y-%m-%d %H-%M-%S")
|
|
||||||
profile = "%s%s_profile_(%s).tab" % (profiles, profileName, timestamp)
|
|
||||||
|
|
||||||
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:
|
||||||
|
|
Loading…
Reference in a new issue