Skip to content

Commit d063fb6

Browse files
authored
Merge PR #201: Allow float values for metrics captured in RebenchLog
2 parents 6153382 + 173739a commit d063fb6

File tree

3 files changed

+57
-9
lines changed

3 files changed

+57
-9
lines changed

docs/extensions.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,11 +76,11 @@ Savina.Chameneos: iterations=1 runtime: 48581us
7676
Implementation Notes:
7777

7878
- For parsing of the total run time, the following regular expression is used:
79-
`r"^(?:.*: )?([^\s]+)( [\w\.]+)?: iterations=([0-9]+) runtime: ([0-9]+)([mu])s")`
79+
`^(?:.*: )?([^\s]+)( [\w\.]+)?: iterations=([0-9]+) runtime: (?P<runtime>(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?)(?P<unit>[mu])s`
8080

8181
- For arbitrary criteria, which may also be used for the `total` criteria,
8282
the following regular expression should match
83-
`r"^(?:.*: )?([^\s]+): ([^:]{1,30}):\s*([0-9]+)([a-zA-Z]+)")`
83+
`^(?:.*: )?([^\s]+): (?P<criterion>[^:]{1,30}):\s*(?P<value>(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?)(?P<unit>[a-zA-Z]+)`
8484

8585

8686
## `Time`

rebench/interop/rebench_log_adapter.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,13 @@ class RebenchLogAdapter(GaugeAdapter):
3434
Note: regular expressions are documented in /docs/extensions.md
3535
"""
3636
re_log_line = re.compile(
37-
r"^(?:.*: )?([^\s]+)( [\w\.]+)?: iterations=([0-9]+) runtime: ([0-9]+)([mu])s")
37+
r"^(?:.*: )?([^\s]+)( [\w\.]+)?: iterations=([0-9]+) "
38+
+ r"runtime: (?P<runtime>(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?)"
39+
+ r"(?P<unit>[mu])s")
3840
re_extra_criterion_log_line = re.compile(
39-
r"^(?:.*: )?([^\s]+): ([^:]{1,30}):\s*([0-9]+)([a-zA-Z]+)")
41+
r"^(?:.*: )?([^\s]+): (?P<criterion>[^:]{1,30}):\s*"
42+
+ r"(?P<value>(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?)"
43+
+ r"(?P<unit>[a-zA-Z]+)")
4044

4145
re_NPB_partial_invalid = re.compile(r".*Failed.*verification")
4246
re_NPB_invalid = re.compile(r".*Benchmark done.*verification failed")
@@ -60,8 +64,8 @@ def parse_data(self, data, run_id, invocation):
6064
measure = None
6165
match = self.re_log_line.match(line)
6266
if match:
63-
time = float(match.group(4))
64-
if match.group(5) == "u":
67+
time = float(match.group("runtime"))
68+
if match.group("unit") == "u":
6569
time /= 1000
6670
criterion = (match.group(2) or 'total').strip()
6771

@@ -70,9 +74,9 @@ def parse_data(self, data, run_id, invocation):
7074
else:
7175
match = self.re_extra_criterion_log_line.match(line)
7276
if match:
73-
value = float(match.group(3))
74-
criterion = match.group(2)
75-
unit = match.group(4)
77+
value = float(match.group("value"))
78+
criterion = match.group("criterion")
79+
unit = match.group("unit")
7680

7781
measure = Measurement(invocation, iteration, value, unit, run_id, criterion)
7882

rebench/tests/interop/rebench_log_adapter_test.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,3 +130,47 @@ def test_other_data(self):
130130
self.assertEqual(40, measure.value)
131131
self.assertEqual('external data', measure.criterion)
132132
self.assertEqual('byte', measure.unit)
133+
134+
def test_other_data_with_float_values(self):
135+
adapter = RebenchLogAdapter(True, None)
136+
data = adapter.parse_data("""Savina.Chameneos: some metrics: 5.7foobar
137+
Savina.Chameneos: external data: 5.2e1GB
138+
Savina.Chameneos: iterations=1 runtime: 64208us""", None, 13)
139+
140+
point = data[0]
141+
measure = point.get_measurements()[0]
142+
143+
self.assertEqual(5.7, measure.value)
144+
self.assertEqual('some metrics', measure.criterion)
145+
self.assertEqual('foobar', measure.unit)
146+
147+
measure = point.get_measurements()[1]
148+
self.assertEqual(52, measure.value)
149+
self.assertEqual('external data', measure.criterion)
150+
self.assertEqual('GB', measure.unit)
151+
152+
def test_float_value(self):
153+
adapter = RebenchLogAdapter(True, None)
154+
data = adapter.parse_data("Dispatch: iterations=1 runtime: 557.123ms", None, 1)
155+
self._assert_basics(data, 557.123, 'ms', 'total', True)
156+
157+
def test_float_value_in_scientific_notation(self):
158+
adapter = RebenchLogAdapter(True, None)
159+
data = adapter.parse_data("Dispatch: iterations=1 runtime: 5.57123e2ms", None, 1)
160+
self._assert_basics(data, 557.123, 'ms', 'total', True)
161+
162+
adapter = RebenchLogAdapter(True, None)
163+
data = adapter.parse_data("Dispatch: iterations=1 runtime: 5.57123e-2ms", None, 1)
164+
self._assert_basics(data, 0.0557123, 'ms', 'total', True)
165+
166+
adapter = RebenchLogAdapter(True, None)
167+
data = adapter.parse_data("Dispatch: iterations=1 runtime: 5.57123E-2ms", None, 1)
168+
self._assert_basics(data, 0.0557123, 'ms', 'total', True)
169+
170+
adapter = RebenchLogAdapter(True, None)
171+
data = adapter.parse_data("Dispatch: iterations=1 runtime: .57ms", None, 1)
172+
self._assert_basics(data, 0.57, 'ms', 'total', True)
173+
174+
adapter = RebenchLogAdapter(True, None)
175+
data = adapter.parse_data("Dispatch: iterations=1 runtime: 57.ms", None, 1)
176+
self._assert_basics(data, 57, 'ms', 'total', True)

0 commit comments

Comments
 (0)