diff --git a/src/bonsai/bonsai/bim/module/qto/operator.py b/src/bonsai/bonsai/bim/module/qto/operator.py index eb2ccda2820..c8d32b58297 100644 --- a/src/bonsai/bonsai/bim/module/qto/operator.py +++ b/src/bonsai/bonsai/bim/module/qto/operator.py @@ -22,6 +22,7 @@ import bonsai.tool as tool import bonsai.core.qto as core from bonsai.bim.module.qto import helper +from ifcopenshell.util.profiler import Profiler class CalculateCircleRadius(bpy.types.Operator): @@ -148,7 +149,8 @@ def _execute(self, context): } ifc_file = tool.Ifc.get() - results = ifc5d.qto.quantify(ifc_file, elements, rules) + with(Profiler("Quantify function time:")): + results = ifc5d.qto.quantify(ifc_file, elements, rules) ifc5d.qto.edit_qtos(ifc_file, results) not_quantified_elements = elements - set(results.keys()) @@ -190,7 +192,8 @@ def run_quantification( ) -> set[ifcopenshell.entity_instance]: rules = ifc5d.qto.rules[rule] ifc_file = tool.Ifc.get() - results = ifc5d.qto.quantify(ifc_file, elements, rules) + with(Profiler("Quantify function time:")): + results = ifc5d.qto.quantify(ifc_file, elements, rules) ifc5d.qto.edit_qtos(ifc_file, results) not_quantified_elements = elements - set(results.keys()) return not_quantified_elements diff --git a/src/ifcopenshell-python/ifcopenshell/util/profiler.py b/src/ifcopenshell-python/ifcopenshell/util/profiler.py new file mode 100644 index 00000000000..aabfe37977a --- /dev/null +++ b/src/ifcopenshell-python/ifcopenshell/util/profiler.py @@ -0,0 +1,34 @@ +# IfcOpenShell - IFC toolkit and geometry engine +# Copyright (C) 2021 Dion Moult +# +# This file is part of IfcOpenShell. +# +# IfcOpenShell is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# IfcOpenShell is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with IfcOpenShell. If not, see . + + +from timeit import default_timer as timer + +class Profiler: + """ + A python context manager timing utility, useful for measure functions performances + """ + + def __init__(self, task): + self.task = task + + def __enter__(self): + self.start = timer() + + def __exit__(self, *args): + print(f"{self.task} {timer() - self.start:.6f} s")