From 044d06168994790a4f268464dcfe9d62785e4d98 Mon Sep 17 00:00:00 2001 From: "Jens H. Nielsen" Date: Thu, 11 Dec 2025 09:34:32 +0100 Subject: [PATCH 1/2] Track time spend in add_result Track time spend in add_result of Datasaver and record as span attribute for each measurement run to allow comparison to total run time. --- src/qcodes/dataset/measurements.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/qcodes/dataset/measurements.py b/src/qcodes/dataset/measurements.py index 6eb4c054df3d..69a4c84852df 100644 --- a/src/qcodes/dataset/measurements.py +++ b/src/qcodes/dataset/measurements.py @@ -67,6 +67,7 @@ log = logging.getLogger(__name__) TRACER = trace.get_tracer(__name__) + ActionType = tuple[Callable[..., Any], Sequence[Any]] SubscriberType = tuple[ Callable[..., Any], MutableSequence[Any] | MutableMapping[Any, Any] @@ -98,6 +99,7 @@ def __init__( ) -> None: self._span = span self._dataset = dataset + self._add_result_time = 0.0 if ( DataSaver.default_callback is not None and "run_tables_subscription_callback" in DataSaver.default_callback @@ -207,6 +209,7 @@ def add_result(self, *result_tuples: ResType) -> None: its type. """ + start_time = perf_counter() parameter_results: list[ParameterResultType] = [ self._coerce_result_tuple_to_parameter_result_type(result_tuple) @@ -277,6 +280,7 @@ def add_result(self, *result_tuples: ResType) -> None: if perf_counter() - self._last_save_time > self.write_period: self.flush_data_to_database() self._last_save_time = perf_counter() + self._add_result_time += perf_counter() - start_time def _unpack_arrayparameter( self, partial_result: ResType @@ -734,6 +738,8 @@ def __exit__( with DelayedKeyboardInterrupt( context={"reason": "qcodes measurement exit", "qcodes_guid": self.ds.guid} ): + add_result_time = self.datasaver._add_result_time + self._span.set_attribute("qcodes_add_result_time", add_result_time) self.datasaver.flush_data_to_database(block=True) # perform the "teardown" events From a36188506cece28cc2e352ef8bb70ee41125c672 Mon Sep 17 00:00:00 2001 From: "Jens H. Nielsen" Date: Thu, 11 Dec 2025 10:49:26 +0100 Subject: [PATCH 2/2] Avoid roundoff errors --- src/qcodes/dataset/measurements.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qcodes/dataset/measurements.py b/src/qcodes/dataset/measurements.py index 69a4c84852df..a13d0ff5e059 100644 --- a/src/qcodes/dataset/measurements.py +++ b/src/qcodes/dataset/measurements.py @@ -17,7 +17,7 @@ from inspect import signature from itertools import chain from numbers import Number -from time import perf_counter +from time import perf_counter, perf_counter_ns from typing import TYPE_CHECKING, Any, TypeAlias, TypeVar, cast import numpy as np @@ -99,7 +99,7 @@ def __init__( ) -> None: self._span = span self._dataset = dataset - self._add_result_time = 0.0 + self._add_result_time_ns = 0 if ( DataSaver.default_callback is not None and "run_tables_subscription_callback" in DataSaver.default_callback @@ -209,7 +209,7 @@ def add_result(self, *result_tuples: ResType) -> None: its type. """ - start_time = perf_counter() + start_time = perf_counter_ns() parameter_results: list[ParameterResultType] = [ self._coerce_result_tuple_to_parameter_result_type(result_tuple) @@ -280,7 +280,7 @@ def add_result(self, *result_tuples: ResType) -> None: if perf_counter() - self._last_save_time > self.write_period: self.flush_data_to_database() self._last_save_time = perf_counter() - self._add_result_time += perf_counter() - start_time + self._add_result_time_ns += perf_counter_ns() - start_time def _unpack_arrayparameter( self, partial_result: ResType @@ -738,8 +738,8 @@ def __exit__( with DelayedKeyboardInterrupt( context={"reason": "qcodes measurement exit", "qcodes_guid": self.ds.guid} ): - add_result_time = self.datasaver._add_result_time - self._span.set_attribute("qcodes_add_result_time", add_result_time) + add_result_time = self.datasaver._add_result_time_ns + self._span.set_attribute("qcodes_add_result_time_ms", add_result_time / 1e6) self.datasaver.flush_data_to_database(block=True) # perform the "teardown" events