Add profiler in ifcopenshell util and ifc5d quantify function time

Useful for quantify function optimization
This commit is contained in:
Massimo Fabbro
2025-11-08 20:00:35 +01:00
committed by GitHub
parent 5a511eecc1
commit ed2b2de79a
2 changed files with 39 additions and 2 deletions
+5 -2
View File
@@ -22,6 +22,7 @@ import ifcopenshell.api
import bonsai.tool as tool import bonsai.tool as tool
import bonsai.core.qto as core import bonsai.core.qto as core
from bonsai.bim.module.qto import helper from bonsai.bim.module.qto import helper
from ifcopenshell.util.profiler import Profiler
class CalculateCircleRadius(bpy.types.Operator): class CalculateCircleRadius(bpy.types.Operator):
@@ -148,7 +149,8 @@ class CalculateSingleQuantity(bpy.types.Operator, tool.Ifc.Operator):
} }
ifc_file = tool.Ifc.get() 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) ifc5d.qto.edit_qtos(ifc_file, results)
not_quantified_elements = elements - set(results.keys()) not_quantified_elements = elements - set(results.keys())
@@ -190,7 +192,8 @@ class PerformQuantityTakeOff(bpy.types.Operator, tool.Ifc.Operator):
) -> set[ifcopenshell.entity_instance]: ) -> set[ifcopenshell.entity_instance]:
rules = ifc5d.qto.rules[rule] rules = ifc5d.qto.rules[rule]
ifc_file = tool.Ifc.get() 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) ifc5d.qto.edit_qtos(ifc_file, results)
not_quantified_elements = elements - set(results.keys()) not_quantified_elements = elements - set(results.keys())
return not_quantified_elements return not_quantified_elements
@@ -0,0 +1,34 @@
# IfcOpenShell - IFC toolkit and geometry engine
# Copyright (C) 2021 Dion Moult <dion@thinkmoult.com>
#
# 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 <http://www.gnu.org/licenses/>.
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")