OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright 2014 the V8 project authors. All rights reserved. | 2 # Copyright 2014 the V8 project authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """ | 6 """ |
7 Performance runner for d8. | 7 Performance runner for d8. |
8 | 8 |
9 Call e.g. with tools/run-perf.py --arch ia32 some_suite.json | 9 Call e.g. with tools/run-perf.py --arch ia32 some_suite.json |
10 | 10 |
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
258 """ | 258 """ |
259 def __init__(self, suite, parent, arch): | 259 def __init__(self, suite, parent, arch): |
260 super(Trace, self).__init__(suite, parent, arch) | 260 super(Trace, self).__init__(suite, parent, arch) |
261 assert self.results_regexp | 261 assert self.results_regexp |
262 self.results = [] | 262 self.results = [] |
263 self.errors = [] | 263 self.errors = [] |
264 self.stddev = "" | 264 self.stddev = "" |
265 | 265 |
266 def ConsumeOutput(self, stdout): | 266 def ConsumeOutput(self, stdout): |
267 try: | 267 try: |
268 self.results.append( | 268 result = re.search(self.results_regexp, stdout, re.M).group(1) |
269 re.search(self.results_regexp, stdout, re.M).group(1)) | 269 self.results.append(str(float(result))) |
| 270 except ValueError: |
| 271 self.errors.append("Regexp \"%s\" returned a non-numeric for test %s." |
| 272 % (self.results_regexp, self.graphs[-1])) |
270 except: | 273 except: |
271 self.errors.append("Regexp \"%s\" didn't match for test %s." | 274 self.errors.append("Regexp \"%s\" didn't match for test %s." |
272 % (self.results_regexp, self.graphs[-1])) | 275 % (self.results_regexp, self.graphs[-1])) |
273 | 276 |
274 try: | 277 try: |
275 if self.stddev_regexp and self.stddev: | 278 if self.stddev_regexp and self.stddev: |
276 self.errors.append("Test %s should only run once since a stddev " | 279 self.errors.append("Test %s should only run once since a stddev " |
277 "is provided by the test." % self.graphs[-1]) | 280 "is provided by the test." % self.graphs[-1]) |
278 if self.stddev_regexp: | 281 if self.stddev_regexp: |
279 self.stddev = re.search(self.stddev_regexp, stdout, re.M).group(1) | 282 self.stddev = re.search(self.stddev_regexp, stdout, re.M).group(1) |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
367 for line in stdout.strip().splitlines(): | 370 for line in stdout.strip().splitlines(): |
368 match = GENERIC_RESULTS_RE.match(line) | 371 match = GENERIC_RESULTS_RE.match(line) |
369 if match: | 372 if match: |
370 stddev = "" | 373 stddev = "" |
371 graph = match.group(1) | 374 graph = match.group(1) |
372 trace = match.group(2) | 375 trace = match.group(2) |
373 body = match.group(3) | 376 body = match.group(3) |
374 units = match.group(4) | 377 units = match.group(4) |
375 match_stddev = RESULT_STDDEV_RE.match(body) | 378 match_stddev = RESULT_STDDEV_RE.match(body) |
376 match_list = RESULT_LIST_RE.match(body) | 379 match_list = RESULT_LIST_RE.match(body) |
| 380 errors = [] |
377 if match_stddev: | 381 if match_stddev: |
378 result, stddev = map(str.strip, match_stddev.group(1).split(",")) | 382 result, stddev = map(str.strip, match_stddev.group(1).split(",")) |
379 results = [result] | 383 results = [result] |
380 elif match_list: | 384 elif match_list: |
381 results = map(str.strip, match_list.group(1).split(",")) | 385 results = map(str.strip, match_list.group(1).split(",")) |
382 else: | 386 else: |
383 results = [body.strip()] | 387 results = [body.strip()] |
384 | 388 |
| 389 try: |
| 390 results = map(lambda r: str(float(r)), results) |
| 391 except ValueError: |
| 392 results = [] |
| 393 errors = ["Found non-numeric in %s" % |
| 394 "/".join(self.graphs + [graph, trace])] |
| 395 |
385 trace_result = traces.setdefault(trace, Results([{ | 396 trace_result = traces.setdefault(trace, Results([{ |
386 "graphs": self.graphs + [graph, trace], | 397 "graphs": self.graphs + [graph, trace], |
387 "units": (units or self.units).strip(), | 398 "units": (units or self.units).strip(), |
388 "results": [], | 399 "results": [], |
389 "stddev": "", | 400 "stddev": "", |
390 }], [])) | 401 }], errors)) |
391 trace_result.traces[0]["results"].extend(results) | 402 trace_result.traces[0]["results"].extend(results) |
392 trace_result.traces[0]["stddev"] = stddev | 403 trace_result.traces[0]["stddev"] = stddev |
393 | 404 |
394 return reduce(lambda r, t: r + t, traces.itervalues(), Results()) | 405 return reduce(lambda r, t: r + t, traces.itervalues(), Results()) |
395 | 406 |
396 | 407 |
397 def MakeGraph(suite, arch, parent): | 408 def MakeGraph(suite, arch, parent): |
398 """Factory method for making graph objects.""" | 409 """Factory method for making graph objects.""" |
399 if isinstance(parent, Runnable): | 410 if isinstance(parent, Runnable): |
400 # Below a runnable can only be traces. | 411 # Below a runnable can only be traces. |
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
671 | 682 |
672 if options.json_test_results: | 683 if options.json_test_results: |
673 results.WriteToFile(options.json_test_results) | 684 results.WriteToFile(options.json_test_results) |
674 else: # pragma: no cover | 685 else: # pragma: no cover |
675 print results | 686 print results |
676 | 687 |
677 return min(1, len(results.errors)) | 688 return min(1, len(results.errors)) |
678 | 689 |
679 if __name__ == "__main__": # pragma: no cover | 690 if __name__ == "__main__": # pragma: no cover |
680 sys.exit(Main(sys.argv[1:])) | 691 sys.exit(Main(sys.argv[1:])) |
OLD | NEW |