Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package benchmark for openSUSE:Factory checked in at 2022-12-07 17:34:28 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/benchmark (Old) and /work/SRC/openSUSE:Factory/.benchmark.new.1835 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "benchmark" Wed Dec 7 17:34:28 2022 rev:22 rq:1040615 version:1.7.1 Changes: -------- --- /work/SRC/openSUSE:Factory/benchmark/benchmark.changes 2022-08-24 15:10:48.264483754 +0200 +++ /work/SRC/openSUSE:Factory/.benchmark.new.1835/benchmark.changes 2022-12-07 17:35:37.080753663 +0100 @@ -1,0 +2,31 @@ +Mon Dec 05 08:36:46 UTC 2022 - [email protected] + +- Update to version 1.7.1: + * version bump for release + * [bazel] Build libpfm as a dependency to allow collection of perf counters (#1408) + * Add information for supported Python versions to setup.py (#1502) + * Partially revert "Do not depend on unversioned python binary (#1496)" (#1501) + * Do not depend on unversioned python binary (#1496) + * Fix Solaris compilation (#1499) (#1500) + * Support for QuRT OS (Hexagon RTOS) (#1497) + * bump cmake dep and docs (#1468) + * Bump pybind11 version to enable Python 3.11 wheel builds (#1489) + * Discuss sources of variance in the user guide (#1481) + * Stop using pandas.Timedelta (fixes #1482) (#1483) + * Eliminate usage of deprecated API in sysinfo.cc (#1474) + * Enable aarch64 Linux wheel builds, use cibuildwheel action directly (#1472) + * Clean up test documentation formatting (#1475) + * use CMAKE_INSTALL_FULL in pkg-config file (#1473) + * Link error when use as static library on windows. (#1470) + * add debug option for enabling more output for failed cxxfeaturechecks (#1467) + * FIx typo in benchmark.h (#1465) + * run ClearRegisteredBenchmarks at exit (#1463) + * Avoid deprecation warning in NVHPC (#1459) + * Ensure we don't need benchmark installed to pass c++ feature checks (#1456) + * Explicitly cast int literals to int8_t in tests to silence implicit-conversion warnings (#1455) + * Fixed build issues on window (#1449) + * remove unnecessary generated include directory (#1451) + * Initialize help hook before actually parsing the command line (#1447) + * Remove stray comment and added missing header (#1444) + +------------------------------------------------------------------- Old: ---- benchmark-1.7.0.obscpio New: ---- benchmark-1.7.1.obscpio ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ benchmark.spec ++++++ --- /var/tmp/diff_new_pack.3TQ9GM/_old 2022-12-07 17:35:37.980758591 +0100 +++ /var/tmp/diff_new_pack.3TQ9GM/_new 2022-12-07 17:35:37.984758612 +0100 @@ -19,7 +19,7 @@ %define soname lib%{name} %define sover 1 Name: benchmark -Version: 1.7.0 +Version: 1.7.1 Release: 0 Summary: A microbenchmark support library License: Apache-2.0 ++++++ _service ++++++ --- /var/tmp/diff_new_pack.3TQ9GM/_old 2022-12-07 17:35:38.016758788 +0100 +++ /var/tmp/diff_new_pack.3TQ9GM/_new 2022-12-07 17:35:38.020758810 +0100 @@ -1,7 +1,7 @@ <services> <service name="obs_scm" mode="disabled"> - <param name="revision">v1.7.0</param> - <param name="versionformat">1.7.0</param> + <param name="revision">v1.7.1</param> + <param name="versionformat">1.7.1</param> <param name="url">https://github.com/google/benchmark.git</param> <param name="scm">git</param> <param name="changesgenerate">enable</param> ++++++ _servicedata ++++++ --- /var/tmp/diff_new_pack.3TQ9GM/_old 2022-12-07 17:35:38.040758920 +0100 +++ /var/tmp/diff_new_pack.3TQ9GM/_new 2022-12-07 17:35:38.040758920 +0100 @@ -1,6 +1,6 @@ <servicedata> <service name="tar_scm"> <param name="url">https://github.com/google/benchmark.git</param> - <param name="changesrevision">361e8d1cfe0c6c36d30b39f1b61302ece5507320</param></service></servicedata> + <param name="changesrevision">d572f4777349d43653b21d6c2fc63020ab326db2</param></service></servicedata> (No newline at EOF) ++++++ benchmark-1.7.0.obscpio -> benchmark-1.7.1.obscpio ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/AUTHORS new/benchmark-1.7.1/AUTHORS --- old/benchmark-1.7.0/AUTHORS 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/AUTHORS 2022-11-11 15:01:03.000000000 +0100 @@ -50,7 +50,9 @@ Oleksandr Sochka <[email protected]> Ori Livneh <[email protected]> Paul Redmond <[email protected]> +Raghu Raja <[email protected]> Radoslav Yovchev <[email protected]> +Rainer Orth <[email protected]> Roman Lebedev <[email protected]> Sayan Bhattacharjee <[email protected]> Shapr3D <[email protected]> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/BUILD.bazel new/benchmark-1.7.1/BUILD.bazel --- old/benchmark-1.7.0/BUILD.bazel 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/BUILD.bazel 2022-11-11 15:01:03.000000000 +0100 @@ -18,6 +18,14 @@ visibility = [":__subpackages__"], ) +config_setting( + name = "perfcounters", + define_values = { + "pfm": "1", + }, + visibility = [":__subpackages__"], +) + cc_library( name = "benchmark", srcs = glob( @@ -29,7 +37,7 @@ ), hdrs = [ "include/benchmark/benchmark.h", - "include/benchmark/export.h", # From generate_export_header + "include/benchmark/export.h", ], linkopts = select({ ":windows": ["-DEFAULTLIB:shlwapi.lib"], @@ -41,13 +49,22 @@ # Using `defines` (i.e. not `local_defines`) means that no # dependent rules need to bother about defining the macro. linkstatic = True, - defines = ["BENCHMARK_STATIC_DEFINE"], + defines = [ + "BENCHMARK_STATIC_DEFINE", + ] + select({ + ":perfcounters": ["HAVE_LIBPFM"], + "//conditions:default": [], + }), + deps = select({ + ":perfcounters": ["@libpfm//:libpfm"], + "//conditions:default": [], + }), ) cc_library( name = "benchmark_main", srcs = ["src/benchmark_main.cc"], - hdrs = ["include/benchmark/benchmark.h"], + hdrs = ["include/benchmark/benchmark.h", "include/benchmark/export.h"], strip_include_prefix = "include", visibility = ["//visibility:public"], deps = [":benchmark"], diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/CMakeLists.txt new/benchmark-1.7.1/CMakeLists.txt --- old/benchmark-1.7.0/CMakeLists.txt 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/CMakeLists.txt 2022-11-11 15:01:03.000000000 +0100 @@ -1,4 +1,4 @@ -cmake_minimum_required (VERSION 3.5.1) +cmake_minimum_required (VERSION 3.16.3) foreach(p CMP0048 # OK to clear PROJECT_VERSION on project() @@ -6,6 +6,7 @@ CMP0056 # export EXE_LINKER_FLAGS to try_run CMP0057 # Support no if() IN_LIST operator CMP0063 # Honor visibility properties for all targets + CMP0067 # Honor language standard in try_compile() source file signature CMP0077 # Allow option() overrides in importing projects ) if(POLICY ${p}) @@ -13,7 +14,7 @@ endif() endforeach() -project (benchmark VERSION 1.7.0 LANGUAGES CXX) +project (benchmark VERSION 1.7.1 LANGUAGES CXX) option(BENCHMARK_ENABLE_TESTING "Enable testing of the benchmark library." ON) option(BENCHMARK_ENABLE_EXCEPTIONS "Enable the use of exceptions in the benchmark library." ON) @@ -138,6 +139,16 @@ endif() if (MSVC) + set(BENCHMARK_CXX_STANDARD 14) +else() + set(BENCHMARK_CXX_STANDARD 11) +endif() + +set(CMAKE_CXX_STANDARD ${BENCHMARK_CXX_STANDARD}) +set(CMAKE_CXX_STANDARD_REQUIRED YES) +set(CMAKE_CXX_EXTENSIONS OFF) + +if (MSVC) # Turn compiler warnings up to 11 string(REGEX REPLACE "[-/]W[1-4]" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") @@ -169,13 +180,6 @@ set(CMAKE_EXE_LINKER_FLAGS_MINSIZEREL "${CMAKE_EXE_LINKER_FLAGS_MINSIZEREL} /LTCG") endif() else() - # Try and enable C++11. Don't use C++14 because it doesn't work in some - # configurations. - add_cxx_compiler_flag(-std=c++11) - if (NOT HAVE_CXX_FLAG_STD_CXX11) - add_cxx_compiler_flag(-std=c++0x) - endif() - # Turn compiler warnings up to 11 add_cxx_compiler_flag(-Wall) add_cxx_compiler_flag(-Wextra) @@ -223,7 +227,7 @@ add_cxx_compiler_flag(-wd654) add_cxx_compiler_flag(-Wthread-safety) if (HAVE_CXX_FLAG_WTHREAD_SAFETY) - cxx_feature_check(THREAD_SAFETY_ATTRIBUTES) + cxx_feature_check(THREAD_SAFETY_ATTRIBUTES "-DINCLUDE_DIRECTORIES=${PROJECT_SOURCE_DIR}/include") endif() # On most UNIX like platforms g++ and clang++ define _GNU_SOURCE as a diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/CONTRIBUTORS new/benchmark-1.7.1/CONTRIBUTORS --- old/benchmark-1.7.0/CONTRIBUTORS 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/CONTRIBUTORS 2022-11-11 15:01:03.000000000 +0100 @@ -73,6 +73,8 @@ Paul Redmond <[email protected]> Pierre Phaneuf <[email protected]> Radoslav Yovchev <[email protected]> +Rainer Orth <[email protected]> +Raghu Raja <[email protected]> Raul Marin <[email protected]> Ray Glover <[email protected]> Robert Guo <[email protected]> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/WORKSPACE new/benchmark-1.7.1/WORKSPACE --- old/benchmark-1.7.0/WORKSPACE 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/WORKSPACE 2022-11-11 15:01:03.000000000 +0100 @@ -3,6 +3,27 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository") + +http_archive( + name = "bazel_skylib", + urls = [ + "https://mirror.bazel.build/github.com/bazelbuild/bazel-skylib/releases/download/1.2.1/bazel-skylib-1.2.1.tar.gz", + "https://github.com/bazelbuild/bazel-skylib/releases/download/1.2.1/bazel-skylib-1.2.1.tar.gz", + ], + sha256 = "f7be3474d42aae265405a592bb7da8e171919d74c16f082a5457840f06054728", +) + +# https://github.com/bazelbuild/rules_foreign_cc/ +http_archive( + name = "rules_foreign_cc", + sha256 = "bcd0c5f46a49b85b384906daae41d277b3dc0ff27c7c752cc51e43048a58ec83", + strip_prefix = "rules_foreign_cc-0.7.1", + url = "https://github.com/bazelbuild/rules_foreign_cc/archive/0.7.1.tar.gz", +) + +load("@rules_foreign_cc//foreign_cc:repositories.bzl", "rules_foreign_cc_dependencies") +rules_foreign_cc_dependencies() + http_archive( name = "com_google_absl", sha256 = "f41868f7a938605c92936230081175d1eae87f6ea2c248f41077c8f88316f111", @@ -16,12 +37,22 @@ tag = "release-1.11.0", ) +# Downloaded from v4.9.0 tag at https://sourceforge.net/p/perfmon2/libpfm4/ref/master/tags/ +http_archive( + name = "libpfm", + build_file = "//tools:libpfm.BUILD.bazel", + sha256 = "5da5f8872bde14b3634c9688d980f68bda28b510268723cc12973eedbab9fecc", + type = "tar.gz", + strip_prefix = "libpfm-4.11.0", + urls = ["https://sourceforge.net/projects/perfmon2/files/libpfm4/libpfm-4.11.0.tar.gz/download"], +) + http_archive( name = "pybind11", build_file = "@//bindings/python:pybind11.BUILD", - sha256 = "1eed57bc6863190e35637290f97a20c81cfe4d9090ac0a24f3bbf08f265eb71d", - strip_prefix = "pybind11-2.4.3", - urls = ["https://github.com/pybind/pybind11/archive/v2.4.3.tar.gz"], + sha256 = "eacf582fa8f696227988d08cfc46121770823839fe9e301a20fbce67e7cd70ec", + strip_prefix = "pybind11-2.10.0", + urls = ["https://github.com/pybind/pybind11/archive/v2.10.0.tar.gz"], ) new_local_repository( diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/bindings/python/google_benchmark/__init__.py new/benchmark-1.7.1/bindings/python/google_benchmark/__init__.py --- old/benchmark-1.7.0/bindings/python/google_benchmark/__init__.py 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/bindings/python/google_benchmark/__init__.py 2022-11-11 15:01:03.000000000 +0100 @@ -26,6 +26,7 @@ if __name__ == '__main__': benchmark.main() """ +import atexit from absl import app from google_benchmark import _benchmark @@ -68,7 +69,7 @@ "State", ] -__version__ = "1.7.0" +__version__ = "1.7.1" class __OptionMaker: @@ -158,3 +159,4 @@ # Methods for use with custom main function. initialize = _benchmark.Initialize run_benchmarks = _benchmark.RunSpecifiedBenchmarks +atexit.register(_benchmark.ClearRegisteredBenchmarks) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/bindings/python/google_benchmark/benchmark.cc new/benchmark-1.7.1/bindings/python/google_benchmark/benchmark.cc --- old/benchmark-1.7.0/bindings/python/google_benchmark/benchmark.cc 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/bindings/python/google_benchmark/benchmark.cc 2022-11-11 15:01:03.000000000 +0100 @@ -179,5 +179,6 @@ py::return_value_policy::reference); m.def("RunSpecifiedBenchmarks", []() { benchmark::RunSpecifiedBenchmarks(); }); + m.def("ClearRegisteredBenchmarks", benchmark::ClearRegisteredBenchmarks); }; } // namespace diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/cmake/CXXFeatureCheck.cmake new/benchmark-1.7.1/cmake/CXXFeatureCheck.cmake --- old/benchmark-1.7.0/cmake/CXXFeatureCheck.cmake 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/cmake/CXXFeatureCheck.cmake 2022-11-11 15:01:03.000000000 +0100 @@ -17,6 +17,8 @@ endif() set(__cxx_feature_check INCLUDED) +option(CXXFEATURECHECK_DEBUG OFF) + function(cxx_feature_check FILE) string(TOLOWER ${FILE} FILE) string(TOUPPER ${FILE} VAR) @@ -27,17 +29,18 @@ return() endif() + set(FEATURE_CHECK_CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS}) if (ARGC GREATER 1) message(STATUS "Enabling additional flags: ${ARGV1}") - list(APPEND BENCHMARK_CXX_LINKER_FLAGS ${ARGV1}) + list(APPEND FEATURE_CHECK_CMAKE_FLAGS ${ARGV1}) endif() if (NOT DEFINED COMPILE_${FEATURE}) - message(STATUS "Performing Test ${FEATURE}") if(CMAKE_CROSSCOMPILING) + message(STATUS "Cross-compiling to test ${FEATURE}") try_compile(COMPILE_${FEATURE} ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp - CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS} + CMAKE_FLAGS ${FEATURE_CHECK_CMAKE_FLAGS} LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES} OUTPUT_VARIABLE COMPILE_OUTPUT_VAR) if(COMPILE_${FEATURE}) @@ -48,10 +51,10 @@ set(RUN_${FEATURE} 1 CACHE INTERNAL "") endif() else() - message(STATUS "Performing Test ${FEATURE}") + message(STATUS "Compiling and running to test ${FEATURE}") try_run(RUN_${FEATURE} COMPILE_${FEATURE} ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/cmake/${FILE}.cpp - CMAKE_FLAGS ${BENCHMARK_CXX_LINKER_FLAGS} + CMAKE_FLAGS ${FEATURE_CHECK_CMAKE_FLAGS} LINK_LIBRARIES ${BENCHMARK_CXX_LIBRARIES} COMPILE_OUTPUT_VARIABLE COMPILE_OUTPUT_VAR) endif() @@ -63,7 +66,11 @@ add_definitions(-DHAVE_${VAR}) else() if(NOT COMPILE_${FEATURE}) - message(STATUS "Performing Test ${FEATURE} -- failed to compile: ${COMPILE_OUTPUT_VAR}") + if(CXXFEATURECHECK_DEBUG) + message(STATUS "Performing Test ${FEATURE} -- failed to compile: ${COMPILE_OUTPUT_VAR}") + else() + message(STATUS "Performing Test ${FEATURE} -- failed to compile") + endif() else() message(STATUS "Performing Test ${FEATURE} -- compiled but failed to run") endif() diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/cmake/benchmark.pc.in new/benchmark-1.7.1/cmake/benchmark.pc.in --- old/benchmark-1.7.0/cmake/benchmark.pc.in 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/cmake/benchmark.pc.in 2022-11-11 15:01:03.000000000 +0100 @@ -1,7 +1,7 @@ prefix=@CMAKE_INSTALL_PREFIX@ exec_prefix=${prefix} -libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ -includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ +libdir=@CMAKE_INSTALL_FULL_LIBDIR@ +includedir=@CMAKE_INSTALL_FULL_INCLUDEDIR@ Name: @PROJECT_NAME@ Description: Google microbenchmark framework diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/docs/dependencies.md new/benchmark-1.7.1/docs/dependencies.md --- old/benchmark-1.7.0/docs/dependencies.md 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/docs/dependencies.md 2022-11-11 15:01:03.000000000 +0100 @@ -7,13 +7,15 @@ * The last two Ubuntu LTS releases Currently, this means using build tool versions that are available for Ubuntu -18.04 (Bionic Beaver), Ubuntu 20.04 (Focal Fossa), and Debian 11 (bullseye). +Ubuntu 20.04 (Focal Fossa), Ubuntu 22.04 (Jammy Jellyfish) and Debian 11.4 (bullseye). -_Note, CI also runs ubuntu-16.04 and ubuntu-14.04 to ensure best effort support -for older versions._ +_Note, CI also runs ubuntu-18.04 to attempt best effort support for older versions._ ## cmake -The current supported version is cmake 3.5.1 as of 2018-06-06. +The current supported version is cmake 3.16.3 as of 2022-08-10. + +* _3.10.2 (ubuntu 18.04)_ +* 3.16.3 (ubuntu 20.04) +* 3.18.4 (debian 11.4) +* 3.22.1 (ubuntu 22.04) -_Note, this version is also available for Ubuntu 14.04, an older Ubuntu LTS -release, as `cmake3`._ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/docs/perf_counters.md new/benchmark-1.7.1/docs/perf_counters.md --- old/benchmark-1.7.0/docs/perf_counters.md 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/docs/perf_counters.md 2022-11-11 15:01:03.000000000 +0100 @@ -12,16 +12,17 @@ * The benchmark is run on an architecture featuring a Performance Monitoring Unit (PMU), * The benchmark is compiled with support for collecting counters. Currently, - this requires [libpfm](http://perfmon2.sourceforge.net/) be available at build - time + this requires [libpfm](http://perfmon2.sourceforge.net/), which is built as a + dependency via Bazel. The feature does not require modifying benchmark code. Counter collection is handled at the boundaries where timer collection is also handled. To opt-in: - -* Install `libpfm4-dev`, e.g. `apt-get install libpfm4-dev`. -* Enable the cmake flag BENCHMARK_ENABLE_LIBPFM. +* If using a Bazel build, add `--define pfm=1` to your buid flags +* If using CMake: + * Install `libpfm4-dev`, e.g. `apt-get install libpfm4-dev`. + * Enable the CMake flag `BENCHMARK_ENABLE_LIBPFM` in `CMakeLists.txt`. To use, pass a comma-separated list of counter names through the `--benchmark_perf_counters` flag. The names are decoded through libpfm - meaning, @@ -31,4 +32,4 @@ The counter values are reported back through the [User Counters](../README.md#custom-counters) mechanism, meaning, they are available in all the formats (e.g. JSON) supported -by User Counters. \ No newline at end of file +by User Counters. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/docs/reducing_variance.md new/benchmark-1.7.1/docs/reducing_variance.md --- old/benchmark-1.7.0/docs/reducing_variance.md 1970-01-01 01:00:00.000000000 +0100 +++ new/benchmark-1.7.1/docs/reducing_variance.md 2022-11-11 15:01:03.000000000 +0100 @@ -0,0 +1,100 @@ +# Reducing Variance + +<a name="disabling-cpu-frequency-scaling" /> + +## Disabling CPU Frequency Scaling + +If you see this error: + +``` +***WARNING*** CPU scaling is enabled, the benchmark real time measurements may be noisy and will incur extra overhead. +``` + +you might want to disable the CPU frequency scaling while running the +benchmark, as well as consider other ways to stabilize the performance of +your system while benchmarking. + +See [Reducing Variance](reducing_variance.md) for more information. + +Exactly how to do this depends on the Linux distribution, +desktop environment, and installed programs. Specific details are a moving +target, so we will not attempt to exhaustively document them here. + +One simple option is to use the `cpupower` program to change the +performance governor to "performance". This tool is maintained along with +the Linux kernel and provided by your distribution. + +It must be run as root, like this: + +```bash +sudo cpupower frequency-set --governor performance +``` + +After this you can verify that all CPUs are using the performance governor +by running this command: + +```bash +cpupower frequency-info -o proc +``` + +The benchmarks you subsequently run will have less variance. + +<a name="reducing-variance" /> + +## Reducing Variance in Benchmarks + +The Linux CPU frequency governor [discussed +above](user_guide#disabling-cpu-frequency-scaling) is not the only source +of noise in benchmarks. Some, but not all, of the sources of variance +include: + +1. On multi-core machines not all CPUs/CPU cores/CPU threads run the same + speed, so running a benchmark one time and then again may give a + different result depending on which CPU it ran on. +2. CPU scaling features that run on the CPU, like Intel's Turbo Boost and + AMD Turbo Core and Precision Boost, can temporarily change the CPU + frequency even when the using the "performance" governor on Linux. +3. Context switching between CPUs, or scheduling competition on the CPU the + benchmark is running on. +4. Intel Hyperthreading or AMD SMT causing the same issue as above. +5. Cache effects caused by code running on other CPUs. +6. Non-uniform memory architectures (NUMA). + +These can cause variance in benchmarks results within a single run +(`--benchmark_repetitions=N`) or across multiple runs of the benchmark +program. + +Reducing sources of variance is OS and architecture dependent, which is one +reason some companies maintain machines dedicated to performance testing. + +Some of the easier and and effective ways of reducing variance on a typical +Linux workstation are: + +1. Use the performance governer as [discussed +above](user_guide#disabling-cpu-frequency-scaling). +1. Disable processor boosting by: + ```sh + echo 0 | sudo tee /sys/devices/system/cpu/cpufreq/boost + ``` + See the Linux kernel's + [boost.txt](https://www.kernel.org/doc/Documentation/cpu-freq/boost.txt) + for more information. +2. Set the benchmark program's task affinity to a fixed cpu. For example: + ```sh + taskset -c 0 ./mybenchmark + ``` +3. Disabling Hyperthreading/SMT. This can be done in the Bios or using the + `/sys` file system (see the LLVM project's [Benchmarking + tips](https://llvm.org/docs/Benchmarking.html)). +4. Close other programs that do non-trivial things based on timers, such as + your web browser, desktop environment, etc. +5. Reduce the working set of your benchmark to fit within the L1 cache, but + do be aware that this may lead you to optimize for an unrelistic + situation. + +Further resources on this topic: + +1. The LLVM project's [Benchmarking + tips](https://llvm.org/docs/Benchmarking.html). +1. The Arch Wiki [Cpu frequency +scaling](https://wiki.archlinux.org/title/CPU_frequency_scaling) page. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/docs/user_guide.md new/benchmark-1.7.1/docs/user_guide.md --- old/benchmark-1.7.0/docs/user_guide.md 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/docs/user_guide.md 2022-11-11 15:01:03.000000000 +0100 @@ -58,8 +58,11 @@ [A Faster KeepRunning Loop](#a-faster-keep-running-loop) +## Benchmarking Tips + [Disabling CPU Frequency Scaling](#disabling-cpu-frequency-scaling) +[Reducing Variance in Benchmarks](reducing_variance.md) <a name="output-formats" /> @@ -1243,35 +1246,7 @@ ``` you might want to disable the CPU frequency scaling while running the -benchmark. Exactly how to do this depends on the Linux distribution, -desktop environment, and installed programs. Specific details are a moving -target, so we will not attempt to exhaustively document them here. - -One simple option is to use the `cpupower` program to change the -performance governor to "performance". This tool is maintained along with -the Linux kernel and provided by your distribution. - -It must be run as root, like this: - -```bash -sudo cpupower frequency-set --governor performance -``` - -After this you can verify that all CPUs are using the performance governor -by running this command: - -```bash -cpupower frequency-info -o proc -``` - -The benchmarks you subsequently run will have less variance. - -Note that changing the governor in this way will not persist across -reboots. To set the governor back, run the first command again with the -governor your system usually runs with, which varies. +benchmark, as well as consider other ways to stabilize the performance of +your system while benchmarking. -If you find yourself doing this often, there are probably better options -than running the commands above. Some approaches allow you to do this -without root access, or by using a GUI, etc. The Arch Wiki [Cpu frequency -scaling](https://wiki.archlinux.org/title/CPU_frequency_scaling) page is a -good place to start looking for options. +See [Reducing Variance](reducing_variance.md) for more information. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/include/benchmark/benchmark.h new/benchmark-1.7.1/include/benchmark/benchmark.h --- old/benchmark-1.7.0/include/benchmark/benchmark.h 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/include/benchmark/benchmark.h 2022-11-11 15:01:03.000000000 +0100 @@ -220,29 +220,18 @@ #if defined(__GNUC__) || defined(__clang__) #define BENCHMARK_ALWAYS_INLINE __attribute__((always_inline)) -#define BENCHMARK_NOEXCEPT noexcept -#define BENCHMARK_NOEXCEPT_OP(x) noexcept(x) #elif defined(_MSC_VER) && !defined(__clang__) #define BENCHMARK_ALWAYS_INLINE __forceinline -#if _MSC_VER >= 1900 -#define BENCHMARK_NOEXCEPT noexcept -#define BENCHMARK_NOEXCEPT_OP(x) noexcept(x) -#else -#define BENCHMARK_NOEXCEPT -#define BENCHMARK_NOEXCEPT_OP(x) -#endif #define __func__ __FUNCTION__ #else #define BENCHMARK_ALWAYS_INLINE -#define BENCHMARK_NOEXCEPT -#define BENCHMARK_NOEXCEPT_OP(x) #endif #define BENCHMARK_INTERNAL_TOSTRING2(x) #x #define BENCHMARK_INTERNAL_TOSTRING(x) BENCHMARK_INTERNAL_TOSTRING2(x) // clang-format off -#if defined(__GNUC__) || defined(__clang__) +#if defined(__GNUC__) && !defined(__NVCC__) || defined(__clang__) #define BENCHMARK_BUILTIN_EXPECT(x, y) __builtin_expect(x, y) #define BENCHMARK_DEPRECATED_MSG(msg) __attribute__((deprecated(msg))) #define BENCHMARK_DISABLE_DEPRECATED_WARNING \ @@ -417,6 +406,8 @@ class BenchmarkImp; class BenchmarkFamilies; +BENCHMARK_EXPORT std::map<std::string, std::string>*& GetGlobalContext(); + BENCHMARK_EXPORT void UseCharPointer(char const volatile*); @@ -1116,7 +1107,7 @@ // By default, the CPU time is measured only for the main thread, which may // be unrepresentative if the benchmark uses threads internally. If called, // the total CPU time spent by all the threads will be measured instead. - // By default, the only the main thread CPU time will be measured. + // By default, only the main thread CPU time will be measured. Benchmark* MeasureProcessCPUTime(); // If a particular benchmark should use the Wall clock instead of the CPU time @@ -1543,8 +1534,15 @@ #endif // Helper macro to create a main routine in a test that runs the benchmarks +// Note the workaround for Hexagon simulator passing argc != 0, argv = NULL. #define BENCHMARK_MAIN() \ int main(int argc, char** argv) { \ + char arg0_default[] = "benchmark"; \ + char* args_default = arg0_default; \ + if (!argv) { \ + argc = 1; \ + argv = &args_default; \ + } \ ::benchmark::Initialize(&argc, argv); \ if (::benchmark::ReportUnrecognizedArguments(argc, argv)) return 1; \ ::benchmark::RunSpecifiedBenchmarks(); \ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/requirements.txt new/benchmark-1.7.1/requirements.txt --- old/benchmark-1.7.0/requirements.txt 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/requirements.txt 2022-11-11 15:01:03.000000000 +0100 @@ -1,3 +1,2 @@ numpy == 1.22 scipy == 1.5.4 -pandas == 1.1.5 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/setup.py new/benchmark-1.7.1/setup.py --- old/benchmark-1.7.0/setup.py 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/setup.py 2022-11-11 15:01:03.000000000 +0100 @@ -147,9 +147,11 @@ "Intended Audience :: Developers", "Intended Audience :: Science/Research", "License :: OSI Approved :: Apache Software License", - "Programming Language :: Python :: 3.6", "Programming Language :: Python :: 3.7", "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", "Topic :: Software Development :: Testing", "Topic :: System :: Benchmark", ], diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/CMakeLists.txt new/benchmark-1.7.1/src/CMakeLists.txt --- old/benchmark-1.7.0/src/CMakeLists.txt 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/CMakeLists.txt 2022-11-11 15:01:03.000000000 +0100 @@ -26,7 +26,6 @@ ) target_include_directories(benchmark PUBLIC $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include> - $<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include> ) # libpfm, if available @@ -56,7 +55,7 @@ endif() if (NOT BUILD_SHARED_LIBS) - target_compile_definitions(benchmark PRIVATE -DBENCHMARK_STATIC_DEFINE) + target_compile_definitions(benchmark PUBLIC -DBENCHMARK_STATIC_DEFINE) endif() # Benchmark main library @@ -70,7 +69,6 @@ ) target_link_libraries(benchmark_main PUBLIC benchmark::benchmark) - set(generated_dir "${PROJECT_BINARY_DIR}") set(version_config "${generated_dir}/${PROJECT_NAME}ConfigVersion.cmake") diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/benchmark.cc new/benchmark-1.7.1/src/benchmark.cc --- old/benchmark-1.7.0/src/benchmark.cc 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/benchmark.cc 2022-11-11 15:01:03.000000000 +0100 @@ -19,7 +19,7 @@ #include "internal_macros.h" #ifndef BENCHMARK_OS_WINDOWS -#ifndef BENCHMARK_OS_FUCHSIA +#if !defined(BENCHMARK_OS_FUCHSIA) && !defined(BENCHMARK_OS_QURT) #include <sys/resource.h> #endif #include <sys/time.h> @@ -137,7 +137,11 @@ namespace internal { -BENCHMARK_EXPORT std::map<std::string, std::string>* global_context = nullptr; +std::map<std::string, std::string>* global_context = nullptr; + +BENCHMARK_EXPORT std::map<std::string, std::string>*& GetGlobalContext() { + return global_context; +} // FIXME: wouldn't LTO mess this up? void UseCharPointer(char const volatile*) {} @@ -178,7 +182,7 @@ #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Winvalid-offsetof" #endif -#if defined(__CUDACC__) +#if defined(__NVCC__) #pragma nv_diagnostic push #pragma nv_diag_suppress 1427 #endif @@ -192,7 +196,7 @@ #elif defined(__GNUC__) #pragma GCC diagnostic pop #endif -#if defined(__CUDACC__) +#if defined(__NVCC__) #pragma nv_diagnostic pop #endif } @@ -678,9 +682,9 @@ } void Initialize(int* argc, char** argv, void (*HelperPrintf)()) { + internal::HelperPrintf = HelperPrintf; internal::ParseCommandLineFlags(argc, argv); internal::LogLevel() = FLAGS_v; - internal::HelperPrintf = HelperPrintf; } void Shutdown() { delete internal::global_context; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/benchmark_name.cc new/benchmark-1.7.1/src/benchmark_name.cc --- old/benchmark-1.7.0/src/benchmark_name.cc 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/benchmark_name.cc 2022-11-11 15:01:03.000000000 +0100 @@ -51,6 +51,7 @@ } } // namespace +BENCHMARK_EXPORT std::string BenchmarkName::str() const { return join('/', function_name, args, min_time, min_warmup_time, iterations, repetitions, time_type, threads); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/benchmark_register.cc new/benchmark-1.7.1/src/benchmark_register.cc --- old/benchmark-1.7.0/src/benchmark_register.cc 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/benchmark_register.cc 2022-11-11 15:01:03.000000000 +0100 @@ -15,7 +15,7 @@ #include "benchmark_register.h" #ifndef BENCHMARK_OS_WINDOWS -#ifndef BENCHMARK_OS_FUCHSIA +#if !defined(BENCHMARK_OS_FUCHSIA) && !defined(BENCHMARK_OS_QURT) #include <sys/resource.h> #endif #include <sys/time.h> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/benchmark_register.h new/benchmark-1.7.1/src/benchmark_register.h --- old/benchmark-1.7.0/src/benchmark_register.h 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/benchmark_register.h 2022-11-11 15:01:03.000000000 +0100 @@ -1,6 +1,7 @@ #ifndef BENCHMARK_REGISTER_H #define BENCHMARK_REGISTER_H +#include <algorithm> #include <limits> #include <vector> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/benchmark_runner.cc new/benchmark-1.7.1/src/benchmark_runner.cc --- old/benchmark-1.7.0/src/benchmark_runner.cc 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/benchmark_runner.cc 2022-11-11 15:01:03.000000000 +0100 @@ -19,7 +19,7 @@ #include "internal_macros.h" #ifndef BENCHMARK_OS_WINDOWS -#ifndef BENCHMARK_OS_FUCHSIA +#if !defined(BENCHMARK_OS_FUCHSIA) && !defined(BENCHMARK_OS_QURT) #include <sys/resource.h> #endif #include <sys/time.h> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/check.cc new/benchmark-1.7.1/src/check.cc --- old/benchmark-1.7.0/src/check.cc 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/check.cc 2022-11-11 15:01:03.000000000 +0100 @@ -5,7 +5,7 @@ static AbortHandlerT* handler = &std::abort; -AbortHandlerT*& GetAbortHandler() { return handler; } +BENCHMARK_EXPORT AbortHandlerT*& GetAbortHandler() { return handler; } } // namespace internal } // namespace benchmark diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/check.h new/benchmark-1.7.1/src/check.h --- old/benchmark-1.7.0/src/check.h 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/check.h 2022-11-11 15:01:03.000000000 +0100 @@ -9,6 +9,23 @@ #include "internal_macros.h" #include "log.h" +#if defined(__GNUC__) || defined(__clang__) +#define BENCHMARK_NOEXCEPT noexcept +#define BENCHMARK_NOEXCEPT_OP(x) noexcept(x) +#elif defined(_MSC_VER) && !defined(__clang__) +#if _MSC_VER >= 1900 +#define BENCHMARK_NOEXCEPT noexcept +#define BENCHMARK_NOEXCEPT_OP(x) noexcept(x) +#else +#define BENCHMARK_NOEXCEPT +#define BENCHMARK_NOEXCEPT_OP(x) +#endif +#define __func__ __FUNCTION__ +#else +#define BENCHMARK_NOEXCEPT +#define BENCHMARK_NOEXCEPT_OP(x) +#endif + namespace benchmark { namespace internal { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/commandlineflags.cc new/benchmark-1.7.1/src/commandlineflags.cc --- old/benchmark-1.7.0/src/commandlineflags.cc 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/commandlineflags.cc 2022-11-11 15:01:03.000000000 +0100 @@ -121,12 +121,14 @@ } // namespace +BENCHMARK_EXPORT bool BoolFromEnv(const char* flag, bool default_val) { const std::string env_var = FlagToEnvVar(flag); const char* const value_str = getenv(env_var.c_str()); return value_str == nullptr ? default_val : IsTruthyFlagValue(value_str); } +BENCHMARK_EXPORT int32_t Int32FromEnv(const char* flag, int32_t default_val) { const std::string env_var = FlagToEnvVar(flag); const char* const value_str = getenv(env_var.c_str()); @@ -139,6 +141,7 @@ return value; } +BENCHMARK_EXPORT double DoubleFromEnv(const char* flag, double default_val) { const std::string env_var = FlagToEnvVar(flag); const char* const value_str = getenv(env_var.c_str()); @@ -151,12 +154,14 @@ return value; } +BENCHMARK_EXPORT const char* StringFromEnv(const char* flag, const char* default_val) { const std::string env_var = FlagToEnvVar(flag); const char* const value = getenv(env_var.c_str()); return value == nullptr ? default_val : value; } +BENCHMARK_EXPORT std::map<std::string, std::string> KvPairsFromEnv( const char* flag, std::map<std::string, std::string> default_val) { const std::string env_var = FlagToEnvVar(flag); @@ -201,6 +206,7 @@ return flag_end + 1; } +BENCHMARK_EXPORT bool ParseBoolFlag(const char* str, const char* flag, bool* value) { // Gets the value of the flag as a string. const char* const value_str = ParseFlagValue(str, flag, true); @@ -213,6 +219,7 @@ return true; } +BENCHMARK_EXPORT bool ParseInt32Flag(const char* str, const char* flag, int32_t* value) { // Gets the value of the flag as a string. const char* const value_str = ParseFlagValue(str, flag, false); @@ -225,6 +232,7 @@ value); } +BENCHMARK_EXPORT bool ParseDoubleFlag(const char* str, const char* flag, double* value) { // Gets the value of the flag as a string. const char* const value_str = ParseFlagValue(str, flag, false); @@ -237,6 +245,7 @@ value); } +BENCHMARK_EXPORT bool ParseStringFlag(const char* str, const char* flag, std::string* value) { // Gets the value of the flag as a string. const char* const value_str = ParseFlagValue(str, flag, false); @@ -248,6 +257,7 @@ return true; } +BENCHMARK_EXPORT bool ParseKeyValueFlag(const char* str, const char* flag, std::map<std::string, std::string>* value) { const char* const value_str = ParseFlagValue(str, flag, false); @@ -263,10 +273,12 @@ return true; } +BENCHMARK_EXPORT bool IsFlag(const char* str, const char* flag) { return (ParseFlagValue(str, flag, true) != nullptr); } +BENCHMARK_EXPORT bool IsTruthyFlagValue(const std::string& value) { if (value.size() == 1) { char v = value[0]; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/console_reporter.cc new/benchmark-1.7.1/src/console_reporter.cc --- old/benchmark-1.7.0/src/console_reporter.cc 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/console_reporter.cc 2022-11-11 15:01:03.000000000 +0100 @@ -33,6 +33,7 @@ namespace benchmark { +BENCHMARK_EXPORT bool ConsoleReporter::ReportContext(const Context& context) { name_field_width_ = context.name_field_width; printed_header_ = false; @@ -52,6 +53,7 @@ return true; } +BENCHMARK_EXPORT void ConsoleReporter::PrintHeader(const Run& run) { std::string str = FormatString("%-*s %13s %15s %12s", static_cast<int>(name_field_width_), @@ -69,6 +71,7 @@ GetOutputStream() << line << "\n" << str << "\n" << line << "\n"; } +BENCHMARK_EXPORT void ConsoleReporter::ReportRuns(const std::vector<Run>& reports) { for (const auto& run : reports) { // print the header: @@ -120,6 +123,7 @@ return FormatString("%10.0f", time); } +BENCHMARK_EXPORT void ConsoleReporter::PrintRunData(const Run& result) { typedef void(PrinterFn)(std::ostream&, LogColor, const char*, ...); auto& Out = GetOutputStream(); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/csv_reporter.cc new/benchmark-1.7.1/src/csv_reporter.cc --- old/benchmark-1.7.0/src/csv_reporter.cc 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/csv_reporter.cc 2022-11-11 15:01:03.000000000 +0100 @@ -52,11 +52,13 @@ return '"' + tmp + '"'; } +BENCHMARK_EXPORT bool CSVReporter::ReportContext(const Context& context) { PrintBasicContext(&GetErrorStream(), context); return true; } +BENCHMARK_EXPORT void CSVReporter::ReportRuns(const std::vector<Run>& reports) { std::ostream& Out = GetOutputStream(); @@ -103,6 +105,7 @@ } } +BENCHMARK_EXPORT void CSVReporter::PrintRunData(const Run& run) { std::ostream& Out = GetOutputStream(); Out << CsvEscape(run.benchmark_name()) << ","; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/cycleclock.h new/benchmark-1.7.1/src/cycleclock.h --- old/benchmark-1.7.0/src/cycleclock.h 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/cycleclock.h 2022-11-11 15:01:03.000000000 +0100 @@ -212,6 +212,10 @@ struct timeval tv; gettimeofday(&tv, nullptr); return static_cast<int64_t>(tv.tv_sec) * 1000000 + tv.tv_usec; +#elif defined(__hexagon__) + uint64_t pcycle; + asm volatile("%0 = C15:14" : "=r"(pcycle)); + return static_cast<double>(pcycle); #else // The soft failover to a generic implementation is automatic only for ARM. // For other platforms the developer is expected to make an attempt to create diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/internal_macros.h new/benchmark-1.7.1/src/internal_macros.h --- old/benchmark-1.7.0/src/internal_macros.h 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/internal_macros.h 2022-11-11 15:01:03.000000000 +0100 @@ -1,8 +1,6 @@ #ifndef BENCHMARK_INTERNAL_MACROS_H_ #define BENCHMARK_INTERNAL_MACROS_H_ -#include "benchmark/benchmark.h" - /* Needed to detect STL */ #include <cstdlib> @@ -87,6 +85,8 @@ #define BENCHMARK_OS_QNX 1 #elif defined(__MVS__) #define BENCHMARK_OS_ZOS 1 +#elif defined(__hexagon__) +#define BENCHMARK_OS_QURT 1 #endif #if defined(__ANDROID__) && defined(__GLIBCXX__) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/json_reporter.cc new/benchmark-1.7.1/src/json_reporter.cc --- old/benchmark-1.7.0/src/json_reporter.cc 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/json_reporter.cc 2022-11-11 15:01:03.000000000 +0100 @@ -28,10 +28,6 @@ #include "timers.h" namespace benchmark { -namespace internal { -extern std::map<std::string, std::string>* global_context; -} - namespace { std::string StrEscape(const std::string& s) { @@ -178,8 +174,11 @@ #endif out << indent << FormatKV("library_build_type", build_type); - if (internal::global_context != nullptr) { - for (const auto& kv : *internal::global_context) { + std::map<std::string, std::string>* global_context = + internal::GetGlobalContext(); + + if (global_context != nullptr) { + for (const auto& kv : *global_context) { out << ",\n"; out << indent << FormatKV(kv.first, kv.second); } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/log.h new/benchmark-1.7.1/src/log.h --- old/benchmark-1.7.0/src/log.h 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/log.h 2022-11-11 15:01:03.000000000 +0100 @@ -4,7 +4,12 @@ #include <iostream> #include <ostream> -#include "benchmark/benchmark.h" +// NOTE: this is also defined in benchmark.h but we're trying to avoid a +// dependency. +// The _MSVC_LANG check should detect Visual Studio 2015 Update 3 and newer. +#if __cplusplus >= 201103L || (defined(_MSVC_LANG) && _MSVC_LANG >= 201103L) +#define BENCHMARK_HAS_CXX11 +#endif namespace benchmark { namespace internal { @@ -23,7 +28,16 @@ private: LogType(std::ostream* out) : out_(out) {} std::ostream* out_; - BENCHMARK_DISALLOW_COPY_AND_ASSIGN(LogType); + + // NOTE: we could use BENCHMARK_DISALLOW_COPY_AND_ASSIGN but we shouldn't have + // a dependency on benchmark.h from here. +#ifndef BENCHMARK_HAS_CXX11 + LogType(const LogType&); + LogType& operator=(const LogType&); +#else + LogType(const LogType&) = delete; + LogType& operator=(const LogType&) = delete; +#endif }; template <class Tp> @@ -47,13 +61,13 @@ } inline LogType& GetNullLogInstance() { - static LogType log(nullptr); - return log; + static LogType null_log((std::ostream*)nullptr); + return null_log; } inline LogType& GetErrorLogInstance() { - static LogType log(&std::clog); - return log; + static LogType error_log(&std::clog); + return error_log; } inline LogType& GetLogInstanceForLevel(int level) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/reporter.cc new/benchmark-1.7.1/src/reporter.cc --- old/benchmark-1.7.0/src/reporter.cc 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/reporter.cc 2022-11-11 15:01:03.000000000 +0100 @@ -25,9 +25,6 @@ #include "timers.h" namespace benchmark { -namespace internal { -extern std::map<std::string, std::string> *global_context; -} BenchmarkReporter::BenchmarkReporter() : output_stream_(&std::cout), error_stream_(&std::cerr) {} @@ -39,7 +36,11 @@ BM_CHECK(out) << "cannot be null"; auto &Out = *out; +#ifndef BENCHMARK_OS_QURT + // Date/time information is not available on QuRT. + // Attempting to get it via this call cause the binary to crash. Out << LocalDateTimeString() << "\n"; +#endif if (context.executable_name) Out << "Running " << context.executable_name << "\n"; @@ -67,8 +68,11 @@ Out << "\n"; } - if (internal::global_context != nullptr) { - for (const auto &kv : *internal::global_context) { + std::map<std::string, std::string> *global_context = + internal::GetGlobalContext(); + + if (global_context != nullptr) { + for (const auto &kv : *global_context) { Out << kv.first << ": " << kv.second << "\n"; } } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/string_util.h new/benchmark-1.7.1/src/string_util.h --- old/benchmark-1.7.0/src/string_util.h 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/string_util.h 2022-11-11 15:01:03.000000000 +0100 @@ -4,8 +4,10 @@ #include <sstream> #include <string> #include <utility> +#include <vector> #include "benchmark/export.h" +#include "check.h" #include "internal_macros.h" namespace benchmark { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/sysinfo.cc new/benchmark-1.7.1/src/sysinfo.cc --- old/benchmark-1.7.0/src/sysinfo.cc 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/sysinfo.cc 2022-11-11 15:01:03.000000000 +0100 @@ -23,7 +23,7 @@ #include <codecvt> #else #include <fcntl.h> -#ifndef BENCHMARK_OS_FUCHSIA +#if !defined(BENCHMARK_OS_FUCHSIA) && !defined(BENCHMARK_OS_QURT) #include <sys/resource.h> #endif #include <sys/time.h> @@ -38,10 +38,14 @@ #endif #if defined(BENCHMARK_OS_SOLARIS) #include <kstat.h> +#include <netdb.h> #endif #if defined(BENCHMARK_OS_QNX) #include <sys/syspage.h> #endif +#if defined(BENCHMARK_OS_QURT) +#include <qurt.h> +#endif #include <algorithm> #include <array> @@ -402,6 +406,8 @@ return GetCacheSizesWindows(); #elif defined(BENCHMARK_OS_QNX) return GetCacheSizesQNX(); +#elif defined(BENCHMARK_OS_QURT) + return std::vector<CPUInfo::CacheInfo>(); #else return GetCacheSizesFromKVFS(); #endif @@ -417,14 +423,30 @@ #ifndef UNICODE str = std::string(hostname, DWCOUNT); #else - // Using wstring_convert, Is deprecated in C++17 - using convert_type = std::codecvt_utf8<wchar_t>; - std::wstring_convert<convert_type, wchar_t> converter; - std::wstring wStr(hostname, DWCOUNT); - str = converter.to_bytes(wStr); + std::vector<wchar_t> converted; + // Find the length first. + int len = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, hostname, + DWCOUNT, converted.begin(), 0); + // TODO: Report error from GetLastError()? + if (len == 0) return std::string(""); + converted.reserve(len + 1); + + len = ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, hostname, DWCOUNT, + converted.begin(), converted.size()); + // TODO: Report error from GetLastError()? + if (len == 0) return std::string(""); + str = std::string(converted.data()); #endif return str; -#else // defined(BENCHMARK_OS_WINDOWS) +#elif defined(BENCHMARK_OS_QURT) + std::string str = "Hexagon DSP"; + qurt_arch_version_t arch_version_struct; + if (qurt_sysenv_get_arch_version(&arch_version_struct) == QURT_EOK) { + str += " v"; + str += std::to_string(arch_version_struct.arch_version); + } + return str; +#else #ifndef HOST_NAME_MAX #ifdef BENCHMARK_HAS_SYSCTL // BSD/Mac Doesnt have HOST_NAME_MAX defined #define HOST_NAME_MAX 64 @@ -434,6 +456,8 @@ #define HOST_NAME_MAX 154 #elif defined(BENCHMARK_OS_RTEMS) #define HOST_NAME_MAX 256 +#elif defined(BENCHMARK_OS_SOLARIS) +#define HOST_NAME_MAX MAXHOSTNAMELEN #else #pragma message("HOST_NAME_MAX not defined. using 64") #define HOST_NAME_MAX 64 @@ -463,14 +487,20 @@ // group #elif defined(BENCHMARK_OS_SOLARIS) // Returns -1 in case of a failure. - int num_cpu = sysconf(_SC_NPROCESSORS_ONLN); + long num_cpu = sysconf(_SC_NPROCESSORS_ONLN); if (num_cpu < 0) { fprintf(stderr, "sysconf(_SC_NPROCESSORS_ONLN) failed with error: %s\n", strerror(errno)); } - return num_cpu; + return (int)num_cpu; #elif defined(BENCHMARK_OS_QNX) return static_cast<int>(_syspage_ptr->num_cpu); +#elif defined(BENCHMARK_OS_QURT) + qurt_sysenv_max_hthreads_t hardware_threads; + if (qurt_sysenv_get_max_hw_threads(&hardware_threads) != QURT_EOK) { + hardware_threads.max_hthreads = 1; + } + return hardware_threads.max_hthreads; #else int num_cpus = 0; int max_id = -1; @@ -644,7 +674,8 @@ std::cerr << "failed to open /dev/kstat\n"; return -1; } - kstat_t* ksp = kstat_lookup(kc, (char*)"cpu_info", -1, (char*)"cpu_info0"); + kstat_t* ksp = kstat_lookup(kc, const_cast<char*>("cpu_info"), -1, + const_cast<char*>("cpu_info0")); if (!ksp) { std::cerr << "failed to lookup in /dev/kstat\n"; return -1; @@ -653,8 +684,8 @@ std::cerr << "failed to read from /dev/kstat\n"; return -1; } - kstat_named_t* knp = - (kstat_named_t*)kstat_data_lookup(ksp, (char*)"current_clock_Hz"); + kstat_named_t* knp = (kstat_named_t*)kstat_data_lookup( + ksp, const_cast<char*>("current_clock_Hz")); if (!knp) { std::cerr << "failed to lookup data in /dev/kstat\n"; return -1; @@ -670,6 +701,9 @@ #elif defined(BENCHMARK_OS_QNX) return static_cast<double>((int64_t)(SYSPAGE_ENTRY(cpuinfo)->speed) * (int64_t)(1000 * 1000)); +#elif defined(BENCHMARK_OS_QURT) + // QuRT doesn't provide any API to query Hexagon frequency. + return 1000000000; #endif // If we've fallen through, attempt to roughly estimate the CPU clock rate. static constexpr int estimate_time_ms = 1000; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/src/timers.cc new/benchmark-1.7.1/src/timers.cc --- old/benchmark-1.7.0/src/timers.cc 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/src/timers.cc 2022-11-11 15:01:03.000000000 +0100 @@ -23,7 +23,7 @@ #include <windows.h> #else #include <fcntl.h> -#ifndef BENCHMARK_OS_FUCHSIA +#if !defined(BENCHMARK_OS_FUCHSIA) && !defined(BENCHMARK_OS_QURT) #include <sys/resource.h> #endif #include <sys/time.h> @@ -38,6 +38,9 @@ #include <mach/mach_port.h> #include <mach/thread_act.h> #endif +#if defined(BENCHMARK_OS_QURT) +#include <qurt.h> +#endif #endif #ifdef BENCHMARK_OS_EMSCRIPTEN @@ -79,7 +82,7 @@ static_cast<double>(user.QuadPart)) * 1e-7; } -#elif !defined(BENCHMARK_OS_FUCHSIA) +#elif !defined(BENCHMARK_OS_FUCHSIA) && !defined(BENCHMARK_OS_QURT) double MakeTime(struct rusage const& ru) { return (static_cast<double>(ru.ru_utime.tv_sec) + static_cast<double>(ru.ru_utime.tv_usec) * 1e-6 + @@ -119,6 +122,10 @@ &user_time)) return MakeTime(kernel_time, user_time); DiagnoseAndExit("GetProccessTimes() failed"); +#elif defined(BENCHMARK_OS_QURT) + return static_cast<double>( + qurt_timer_timetick_to_us(qurt_timer_get_ticks())) * + 1.0e-6; #elif defined(BENCHMARK_OS_EMSCRIPTEN) // clock_gettime(CLOCK_PROCESS_CPUTIME_ID, ...) returns 0 on Emscripten. // Use Emscripten-specific API. Reported CPU time would be exactly the @@ -149,6 +156,10 @@ GetThreadTimes(this_thread, &creation_time, &exit_time, &kernel_time, &user_time); return MakeTime(kernel_time, user_time); +#elif defined(BENCHMARK_OS_QURT) + return static_cast<double>( + qurt_timer_timetick_to_us(qurt_timer_get_ticks())) * + 1.0e-6; #elif defined(BENCHMARK_OS_MACOSX) // FIXME We want to use clock_gettime, but its not available in MacOS 10.11. // See https://github.com/google/benchmark/pull/292 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/test/benchmark_gtest.cc new/benchmark-1.7.1/test/benchmark_gtest.cc --- old/benchmark-1.7.0/test/benchmark_gtest.cc 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/test/benchmark_gtest.cc 2022-11-11 15:01:03.000000000 +0100 @@ -3,12 +3,12 @@ #include <vector> #include "../src/benchmark_register.h" +#include "benchmark/benchmark.h" #include "gmock/gmock.h" #include "gtest/gtest.h" namespace benchmark { namespace internal { -BENCHMARK_EXPORT extern std::map<std::string, std::string>* global_context; namespace { @@ -38,8 +38,9 @@ TEST(AddRangeTest, FullRange8) { std::vector<int8_t> dst; - AddRange(&dst, int8_t{1}, std::numeric_limits<int8_t>::max(), 8); - EXPECT_THAT(dst, testing::ElementsAre(1, 8, 64, 127)); + AddRange(&dst, int8_t{1}, std::numeric_limits<int8_t>::max(), int8_t{8}); + EXPECT_THAT( + dst, testing::ElementsAre(int8_t{1}, int8_t{8}, int8_t{64}, int8_t{127})); } TEST(AddRangeTest, FullRange64) { @@ -129,11 +130,13 @@ TEST(AddRangeTest, Simple8) { std::vector<int8_t> dst; - AddRange<int8_t>(&dst, 1, 8, 2); - EXPECT_THAT(dst, testing::ElementsAre(1, 2, 4, 8)); + AddRange<int8_t>(&dst, int8_t{1}, int8_t{8}, int8_t{2}); + EXPECT_THAT(dst, + testing::ElementsAre(int8_t{1}, int8_t{2}, int8_t{4}, int8_t{8})); } TEST(AddCustomContext, Simple) { + std::map<std::string, std::string> *&global_context = GetGlobalContext(); EXPECT_THAT(global_context, nullptr); AddCustomContext("foo", "bar"); @@ -148,6 +151,7 @@ } TEST(AddCustomContext, DuplicateKey) { + std::map<std::string, std::string> *&global_context = GetGlobalContext(); EXPECT_THAT(global_context, nullptr); AddCustomContext("foo", "bar"); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/test/benchmark_setup_teardown_test.cc new/benchmark-1.7.1/test/benchmark_setup_teardown_test.cc --- old/benchmark-1.7.0/test/benchmark_setup_teardown_test.cc 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/test/benchmark_setup_teardown_test.cc 2022-11-11 15:01:03.000000000 +0100 @@ -10,19 +10,19 @@ // Test that Setup() and Teardown() are called exactly once // for each benchmark run (single-threaded). -namespace single { +namespace singlethreaded { static int setup_call = 0; static int teardown_call = 0; -} // namespace single +} // namespace singlethreaded static void DoSetup1(const benchmark::State& state) { - ++single::setup_call; + ++singlethreaded::setup_call; // Setup/Teardown should never be called with any thread_idx != 0. assert(state.thread_index() == 0); } static void DoTeardown1(const benchmark::State& state) { - ++single::teardown_call; + ++singlethreaded::teardown_call; assert(state.thread_index() == 0); } @@ -134,8 +134,8 @@ assert(ret > 0); // Setup/Teardown is called once for each arg group (1,3,5,7). - assert(single::setup_call == 4); - assert(single::teardown_call == 4); + assert(singlethreaded::setup_call == 4); + assert(singlethreaded::teardown_call == 4); // 3 group of threads calling this function (3,5,10). assert(concurrent::setup_call.load(std::memory_order_relaxed) == 3); diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/test/reporter_output_test.cc new/benchmark-1.7.1/test/reporter_output_test.cc --- old/benchmark-1.7.0/test/reporter_output_test.cc 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/test/reporter_output_test.cc 2022-11-11 15:01:03.000000000 +0100 @@ -318,7 +318,7 @@ ADD_CASES(TC_CSVOut, {{"^\"BM_no_arg_name/3\",%csv_report$"}}); // ========================================================================= // -// ------------------------ Testing Arg Name Output ----------------------- // +// ------------------------ Testing Arg Name Output ------------------------ // // ========================================================================= // void BM_arg_name(benchmark::State& state) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/test/user_counters_test.cc new/benchmark-1.7.1/test/user_counters_test.cc --- old/benchmark-1.7.0/test/user_counters_test.cc 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/test/user_counters_test.cc 2022-11-11 15:01:03.000000000 +0100 @@ -195,8 +195,7 @@ CHECK_BENCHMARK_RESULTS("BM_Invert", &CheckInvert); // ========================================================================= // -// ------------------------- InvertedRate Counters Output -// -------------------------- // +// --------------------- InvertedRate Counters Output ---------------------- // // ========================================================================= // void BM_Counters_InvertedRate(benchmark::State& state) { @@ -460,7 +459,7 @@ &CheckIsIterationInvariantRate); // ========================================================================= // -// ------------------- AvgIterations Counters Output ------------------ // +// --------------------- AvgIterations Counters Output --------------------- // // ========================================================================= // void BM_Counters_AvgIterations(benchmark::State& state) { @@ -502,7 +501,7 @@ CHECK_BENCHMARK_RESULTS("BM_Counters_AvgIterations", &CheckAvgIterations); // ========================================================================= // -// ----------------- AvgIterationsRate Counters Output ---------------- // +// ------------------- AvgIterationsRate Counters Output ------------------- // // ========================================================================= // void BM_Counters_kAvgIterationsRate(benchmark::State& state) { diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/tools/compare.py new/benchmark-1.7.1/tools/compare.py --- old/benchmark-1.7.0/tools/compare.py 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/tools/compare.py 2022-11-11 15:01:03.000000000 +0100 @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 import unittest """ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/tools/gbench/report.py new/benchmark-1.7.1/tools/gbench/report.py --- old/benchmark-1.7.0/tools/gbench/report.py 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/tools/gbench/report.py 2022-11-11 15:01:03.000000000 +0100 @@ -9,7 +9,6 @@ from scipy.stats import mannwhitneyu, gmean from numpy import array -from pandas import Timedelta class BenchmarkColor(object): @@ -43,6 +42,13 @@ UTEST_OPTIMAL_REPETITIONS = 9 # Lowest reasonable number, More is better. UTEST_COL_NAME = "_pvalue" +_TIME_UNIT_TO_SECONDS_MULTIPLIER = { + "s": 1.0, + "ms": 1e-3, + "us": 1e-6, + "ns": 1e-9, +} + def color_format(use_color, fmt_str, *args, **kwargs): """ @@ -157,9 +163,9 @@ Get value of field_name field of benchmark, which is time with time unit time_unit, as time in seconds. """ - time_unit = benchmark['time_unit'] if 'time_unit' in benchmark else 's' - dt = Timedelta(benchmark[field_name], time_unit) - return dt / Timedelta(1, 's') + timedelta = benchmark[field_name] + time_unit = benchmark.get('time_unit', 's') + return timedelta * _TIME_UNIT_TO_SECONDS_MULTIPLIER.get(time_unit) def calculate_geomean(json): @@ -454,7 +460,7 @@ ['BM_ThirdFaster', '-0.3333', '-0.3334', '100', '67', '100', '67'], ['BM_NotBadTimeUnit', '-0.9000', '+0.2000', '0', '0', '0', '1'], ['BM_hasLabel', '+0.0000', '+0.0000', '1', '1', '1', '1'], - ['OVERALL_GEOMEAN', '-0.8117', '-0.7783', '0', '0', '0', '0'] + ['OVERALL_GEOMEAN', '-0.8113', '-0.7779', '0', '0', '0', '0'] ] output_lines_with_header = print_difference_report( self.json_diff_report, use_color=False) @@ -591,7 +597,7 @@ 'label': '', 'measurements': [{'real_time': 3.1622776601683826e-06, 'cpu_time': 3.2130844755623912e-06, 'real_time_other': 1.9768988699420897e-07, 'cpu_time_other': 2.397447755209533e-07, - 'time': -0.8117033010153573, 'cpu': -0.7783324768278522}], + 'time': -0.8112976497120911, 'cpu': -0.7778551721181174}], 'time_unit': 's', 'run_type': 'aggregate', 'aggregate_name': 'geomean', 'utest': {} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/tools/libpfm.BUILD.bazel new/benchmark-1.7.1/tools/libpfm.BUILD.bazel --- old/benchmark-1.7.0/tools/libpfm.BUILD.bazel 1970-01-01 01:00:00.000000000 +0100 +++ new/benchmark-1.7.1/tools/libpfm.BUILD.bazel 2022-11-11 15:01:03.000000000 +0100 @@ -0,0 +1,21 @@ +# Build rule for libpfm, which is required to collect performance counters for +# BENCHMARK_ENABLE_LIBPFM builds. + +load("@rules_foreign_cc//foreign_cc:defs.bzl", "make") + +filegroup( + name = "pfm_srcs", + srcs = glob(["**"]), +) + +make( + name = "libpfm", + lib_source = ":pfm_srcs", + lib_name = "libpfm", + copts = [ + "-Wno-format-truncation", + ], + visibility = [ + "//visibility:public", + ], +) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/benchmark-1.7.0/tools/strip_asm.py new/benchmark-1.7.1/tools/strip_asm.py --- old/benchmark-1.7.0/tools/strip_asm.py 2022-07-25 13:35:38.000000000 +0200 +++ new/benchmark-1.7.1/tools/strip_asm.py 2022-11-11 15:01:03.000000000 +0100 @@ -1,4 +1,4 @@ -#!/usr/bin/env python +#!/usr/bin/env python3 """ strip_asm.py - Cleanup ASM output for the specified file ++++++ benchmark.obsinfo ++++++ --- /var/tmp/diff_new_pack.3TQ9GM/_old 2022-12-07 17:35:38.240760014 +0100 +++ /var/tmp/diff_new_pack.3TQ9GM/_new 2022-12-07 17:35:38.244760036 +0100 @@ -1,5 +1,5 @@ name: benchmark -version: 1.7.0 -mtime: 1658748938 -commit: 361e8d1cfe0c6c36d30b39f1b61302ece5507320 +version: 1.7.1 +mtime: 1668175263 +commit: d572f4777349d43653b21d6c2fc63020ab326db2
