aboutsummaryrefslogtreecommitdiff
path: root/test/utils.py
diff options
context:
space:
mode:
authorJ08nY2021-11-27 16:09:27 +0100
committerJ08nY2021-11-27 16:09:27 +0100
commit4c0dd490280c88a54ab7e493907dfb5e8b8eefbf (patch)
tree13529b50b9768bd9c82584fa5685f1f1e77db262 /test/utils.py
parent69f6a0bd10d76d72da799bb22132e8555bc13dd3 (diff)
downloadpyecsca-4c0dd490280c88a54ab7e493907dfb5e8b8eefbf.tar.gz
pyecsca-4c0dd490280c88a54ab7e493907dfb5e8b8eefbf.tar.zst
pyecsca-4c0dd490280c88a54ab7e493907dfb5e8b8eefbf.zip
Diffstat (limited to 'test/utils.py')
-rw-r--r--test/utils.py75
1 files changed, 75 insertions, 0 deletions
diff --git a/test/utils.py b/test/utils.py
new file mode 100644
index 0000000..eeac169
--- /dev/null
+++ b/test/utils.py
@@ -0,0 +1,75 @@
+import pstats
+import sys
+
+from pathlib import Path
+from subprocess import run, PIPE, DEVNULL
+
+from pyinstrument import Profiler as PyProfiler
+from cProfile import Profile as cProfiler
+
+
+class Profiler(object):
+ def __init__(self, prof_type, output_directory, benchmark_name):
+ self._prof = PyProfiler() if prof_type == "py" else cProfiler()
+ self._prof_type = prof_type
+ self._root_frame = None
+ self._state = None
+ self._output_directory = output_directory
+ self._benchmark_name = benchmark_name
+
+ def __enter__(self):
+ self._prof.__enter__()
+ self._state = "in"
+ return self
+
+ def __exit__(self, exc_type, exc_val, exc_tb):
+ self._prof.__exit__(exc_type, exc_val, exc_tb)
+ if self._prof_type == "py":
+ self._root_frame = self._prof.last_session.root_frame()
+ self._state = "out"
+ self.output()
+ self.save()
+
+ def save(self):
+ if self._state != "out":
+ raise ValueError
+ if self._output_directory is None or self._benchmark_name is None:
+ return
+ git_commit = (
+ run(
+ ["git", "rev-parse", "--short", "HEAD"],
+ stdout=PIPE,
+ stderr=DEVNULL,
+ check=False,
+ )
+ .stdout.strip()
+ .decode()
+ )
+ git_dirty = (
+ run(
+ ["git", "diff", "--quiet"], stdout=DEVNULL, stderr=DEVNULL, check=False
+ ).returncode
+ != 0
+ )
+ version = git_commit + ("-dirty" if git_dirty else "")
+ output_path = Path(self._output_directory) / (self._benchmark_name + ".csv")
+ with output_path.open("a") as f:
+ f.write(
+ f"{version},{'.'.join(map(str, sys.version_info[:3]))},{self.get_time()}\n"
+ )
+
+ def output(self):
+ if self._state != "out":
+ raise ValueError
+ if self._prof_type == "py":
+ print(self._prof.output_text(unicode=True, color=True))
+ else:
+ self._prof.print_stats("cumtime")
+
+ def get_time(self):
+ if self._state != "out":
+ raise ValueError
+ if self._prof_type == "py":
+ return self._root_frame.time()
+ else:
+ return pstats.Stats(self._prof).total_tt