Source code for archai.common.timing
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.
from __future__ import annotations
import gc
import timeit
from types import TracebackType
from typing import Optional
[docs]class MeasureBlockTime:
"""Context manager that measures the time elapsed in a block of code."""
def __init__(self, name: str, disable_gc: Optional[bool] = False, verbose: Optional[bool] = False) -> None:
"""Initilize the timer.
Args:
name: Name of the timer.
disable_gc: Whether to disable the garbage collector during the time measurement.
verbose: Whether to print the elapsed time when exiting the context manager.
"""
self.name = name
self.disable_gc = disable_gc
self.verbose = verbose
def __enter__(self) -> MeasureBlockTime:
self.is_gc_enabled = gc.isenabled()
if self.disable_gc:
gc.disable()
self.start_time = timeit.default_timer()
return self
def __exit__(self, exc_type: type[BaseException], exc_val: BaseException, exc_tb: TracebackType) -> None:
if self.disable_gc and self.is_gc_enabled:
gc.enable()
if self.verbose:
print(f"{self.name}: {self.elapsed:.4g} secs")
return False
@property
def elapsed(self) -> float:
"""Return the elapsed time in seconds."""
return timeit.default_timer() - self.start_time