From 999f91baa1c5a4aa842465fda786ab8cc41f288a Mon Sep 17 00:00:00 2001 From: Willi Ballenthin Date: Wed, 27 Nov 2024 10:59:24 +0000 Subject: [PATCH] perf: add timing ctxmgr for logging duration of a block --- capa/perf.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/capa/perf.py b/capa/perf.py index 38962222..c22a095f 100644 --- a/capa/perf.py +++ b/capa/perf.py @@ -5,6 +5,9 @@ # Unless required by applicable law or agreed to in writing, software distributed under the License # is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and limitations under the License. +import time +import inspect +import contextlib import collections # this structure is unstable and may change before the next major release. @@ -14,3 +17,20 @@ counters: collections.Counter[str] = collections.Counter() def reset(): global counters counters = collections.Counter() + + +@contextlib.contextmanager +def timing(msg: str): + """log the given message start/stop and time taken, using the caller's `logger` instance.""" + # stack: + # 0: here + # 1: contextlib + # 2: caller + caller = inspect.stack()[2] + caller_logger = caller.frame.f_globals.get("logger") + + caller_logger.debug("%s...", msg) + t0 = time.time() + yield + t1 = time.time() + caller_logger.debug("%s done in %0.1fs.", msg, t1 - t0)