diff --git a/contrib/teamcity/build-configurations.yml b/contrib/teamcity/build-configurations.yml --- a/contrib/teamcity/build-configurations.yml +++ b/contrib/teamcity/build-configurations.yml @@ -93,6 +93,13 @@ - - bench-bitcoin - - bench-secp256k1 timeout: 1200 + artifacts: + src/bench/BitcoinABC_Bench.csv: bench/BitcoinABC_Bench.csv + src/bench/BitcoinABC_Bench.json: bench/BitcoinABC_Bench.json + post_build: | + "${TOPLEVEL}/contrib/teamcity/nanobench_json_to_teamcity_messages.py" \ + "Bitcoin ABC Benchmark" \ + "${BUILD_DIR}/src/bench/BitcoinABC_Bench.json" build-clang: Werror: true diff --git a/contrib/teamcity/nanobench_json_to_teamcity_messages.py b/contrib/teamcity/nanobench_json_to_teamcity_messages.py new file mode 100755 --- /dev/null +++ b/contrib/teamcity/nanobench_json_to_teamcity_messages.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python3 +# Copyright (c) 2021 The Bitcoin developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +from datetime import timedelta +import json +import sys +from teamcity.messages import TeamcityServiceMessages + +if len(sys.argv) != 3: + print( + """ + Usage: + {} + + Print the teamcity service messages for associating op/s benchmark result + to the tests. + + Requires the teamcity-messages python library: + pip3 install teamcity-messages +""".format(sys.argv[0])) + sys.exit(1) + +suite_name = sys.argv[1] +with open(sys.argv[2], encoding='utf-8') as f: + json_results = json.load(f) + +teamcity_messages = TeamcityServiceMessages() + +teamcity_messages.testSuiteStarted( + suite_name +) + + +def testMeta_number_message(test_name, param_name, param_value): + teamcity_messages.message( + 'testMeta', + type='number', + testName=test_name, + name=param_name, + value='{:.2f}'.format(param_value), + ) + + +for result in json_results.get('results', []): + test_name = result['name'] + + teamcity_messages.testStarted( + test_name + ) + + testMeta_number_message( + test_name, + 'ns/{}'.format(result['unit']), + 1e9 * result['median(elapsed)'] / result['batch'], + ) + + testMeta_number_message( + test_name, + '{}/s'.format(result['unit']), + result['batch'] / result['median(elapsed)'], + ) + + testMeta_number_message( + test_name, + 'err%', + 100 * result['medianAbsolutePercentError(elapsed)'], + ) + + testMeta_number_message( + test_name, + 'ins/{}'.format(result['unit']), + result['median(instructions)'] / result['batch'], + ) + + teamcity_messages.testFinished( + test_name, + testDuration=timedelta(seconds=result['totalTime']), + ) + +teamcity_messages.testSuiteFinished( + suite_name +) diff --git a/src/bench/CMakeLists.txt b/src/bench/CMakeLists.txt --- a/src/bench/CMakeLists.txt +++ b/src/bench/CMakeLists.txt @@ -88,7 +88,14 @@ add_test_custom_target(bench-bitcoin TEST_COMMAND "$" + -output_csv=BitcoinABC_Bench.csv + -output_json=BitcoinABC_Bench.json CUSTOM_TARGET_ARGS DEPENDS bitcoin-bench USES_TERMINAL ) + +set_property(DIRECTORY "${CMAKE_SOURCE_DIR}" APPEND PROPERTY ADDITIONAL_CLEAN_FILES + BitcoinABC_Bench.csv + BitcoinABC_Bench.json +)