Commit Graph

1562 Commits

Author SHA1 Message Date
Nicholas Junge
bce46fb413
Drop isort hook for ruff builtin import sorting (#1689)
This behaves the same, and saves a pre-commit step. ruff just needs an
additional package location hint to correctly map first-part packages
(in this case, `google_benchmark`).

This revealed a misformat in the `google_benchmark.__init__`, which is
now fixed.
2023-10-31 10:05:37 +00:00
Nicholas Junge
b93f5a5929
Add pre-commit config and GitHub Actions job (#1688)
* Add pre-commit config and GitHub Actions job

Contains the following hooks:
* buildifier - for formatting and linting Bazel files.
* mypy, ruff, isort, black - for Python typechecking, import hygiene,
static analysis, and formatting.

The pylint CI job was changed to be a pre-commit CI job, where pre-commit
is bootstrapped via Python.

Pylint is currently no longer part of the
code checks, but can be re-added if requested. The reason to drop was
that it does not play nicely with pre-commit, and lots of its
functionality and responsibilities are actually covered in ruff.

* Add dev extra to pyproject.toml for development installs

* Clarify that pre-commit contains only Python and Bazel hooks

* Add one-line docstrings to Bazel modules

* Apply buildifier pre-commit fixes to Bazel files

* Apply pre-commit fixes to Python files

* Supply --profile=black to isort to prevent conflicts

* Fix nanobind build file formatting

* Add tooling configs to `pyproject.toml`

In particular, set line length 80 for all Python files.

* Reformat all Python files to line length 80, fix return type annotations

Also ignores the `tools/compare.py` and `tools/gbench/report.py` files
for mypy, since they emit a barrage of errors which we can deal with
later. The errors are mostly related to dynamic classmethod definition.
2023-10-30 15:35:37 +00:00
Nicholas Junge
b219e18b91
[bindings] Add LTO builds on Windows+MSVC (#1687)
* Add LTO builds on Windows+MSVC

Gates the MSVC switches behind an `@bazel_skylib:selects` statement.

This is a first experiment from best guesses and studying the MSVC docs.

* Fix misleading inline comment
2023-10-27 12:49:43 +01:00
Nicholas Junge
698d1dc8c3
Reapply size optimizations for clang & MSVC, LTO for Mac+Linux (#1685)
* Reapply size optimization for clang, equivalent options for MSVC

Working towards cross-platform optimal nanobind building configurations.

* Add LTO back to non-Windows builds

The Windows case (the option name is "/GL") is more complicated, since
there, the compiler options also need to be passed to the linker if LTO
is enabled.

Since we are gating the linker options on platform at the moment instead
of compiler, we need to implement a Bazel boolean flag for the case
"Platform == MacOS && Compiler == AnyOf(gcc, clang)".
2023-10-25 12:12:18 +01:00
Nicholas Junge
e45585a4b8
Change nanobind linkage to response file approach on macOS (#1638)
* Change nanobind linkage to response file approach

This change needs https://github.com/bazelbuild/bazel/pull/18952 to be
merged first. Fixes macOS linkage of GBM's nanobind bindings on macOS by
supplying a linker response file instead of `-undefined dynamic_lookup`.

The latter has since been deprecated on macOS.

* Fix bazel_skylib checksum, bump skylib version in MODULE.bazel

* Bump Bazel to version 6.4.0 for linker response file support
2023-10-24 13:04:12 +01:00
Nicholas Junge
5893034e46
Add Python 3.12 support (#1676)
* Add Python 3.12 support tag

* Bump nanobind to latest stable v1.6.2 tag

* Add PyPI trusted publishing to GitHub workflow, add Python 3.12 wheel builds

Trusted publishing has been available since v1.8.0 of the pypa-publish
action. It enables password-less authentication and wheel uploads from
the wheel upload job.

`cibuildwheel` was bumped to v2.16.2 to allow Python 3.12 wheel builds.

More info on trusted publishing:
https://github.com/marketplace/actions/pypi-publish#trusted-publishing

The Windows distribution was reverted to `latest` in the OS matrix,
since the discovery problem of MSVC was fixed in a Bazel patch release.

* Bump nanobind to stable v1.7.0 tag
2023-10-23 13:04:39 +01:00
dominic
6a16cee366
Add no-unititialized to tests (#1683) 2023-10-23 08:54:08 +00:00
Vy Nguyen
7495f83e2a
Set -Wno-unused-variable for tests (#1682)
We  used assert() a lot in tests and that can cause build breakages in some of the opt builds (since assert() are removed)

it's not practical to sprinkle "(void)" everywhere so I think setting this warning option is the best option for now.
2023-10-20 12:51:32 +00:00
Andreas Abel
f30c99a7c8
Increase the kMaxIterations limit (#1668)
* Increase the kMaxIterations limit

This fixes #1663. Note that as a result of this change, the columns in the console output can become misaligned if the actual iteration count is too high. This will be dealt with in a separate commit.

* Fix failing test on Windows

* Fix formatting

---------

Co-authored-by: dominic <510002+dmah42@users.noreply.github.com>
2023-10-17 17:13:59 +01:00
Dominic Hamon
365bf7602b fix format in src/sysinfo 2023-10-17 16:50:22 +01:00
dominic
dc9b229b78
add name to clang format job 2023-10-17 16:47:29 +01:00
Ming Zero
ea3c3f983b
Fix building on MinGW: default WINVER is too old (#1681)
MinGW defaults `WINVER` to something very old,
while benchmark requires features gated by `WINVER = 0x0600`,
so manually set update to that.
2023-10-16 18:19:17 +03:00
mosfet80
682153afda
Update bazel.yml (#1671)
Updated actions/checkout@v4

Co-authored-by: dominic <510002+dmah42@users.noreply.github.com>
2023-10-13 10:59:20 -04:00
dominic
ca8d0f7b61
correct cli param in docs 2023-10-08 11:08:46 +01:00
Andreas Abel
7736df0304
Make json and csv output consistent. (#1662)
* Make json and csv output consistent.

Currently, the --benchmark_format=csv option does not output the correct value for the cv statistics. Also, the json output should not contain a time unit for the cv statistics.

* fix formatting

* undo json change

---------

Co-authored-by: dominic <510002+dmah42@users.noreply.github.com>
2023-09-26 13:43:23 +01:00
Mészáros Gergely
c9106a79fa
Audit MSVC references in cmake files to consider clang++ (#1669)
There are three major compilers on Windows targeting the MSVC ABI (i.e.
linking with microsofts STL etc.):
  - `MSVC`
  - `clang-cl` aka clang with the MSVC compatible CLI
  - `clang++` aka clang with gcc compatible CLI

The cmake variable `MSVC` is only set for the first two as it defined in
terms of the CLI interface provided:

> Set to true when the compiler is some version of Microsoft Visual
> C++ or another compiler simulating the Visual C++ cl command-line syntax.

(from cmake docs)

For many of the tests in the library its the ABI that matters not the
cmdline, so check `CMAKE_CXX_SIMULATE_ID` too, if it is `MSVC` the
current compiler is targeting the MSVC ABI. This handles `clang++`
2023-09-26 12:31:24 +01:00
Dominic Hamon
344117638c bump version to 1.8.3 2023-08-31 13:16:50 +01:00
Dominic Hamon
db3e000c1e Merge branch 'jmr-stat-median' 2023-08-25 09:59:02 +01:00
Dominic Hamon
78220d6f0d tweak comment wording 2023-08-25 09:58:30 +01:00
dominic
9f254bddf0
Merge branch 'main' into stat-median 2023-08-24 17:50:56 +01:00
Jesse Rosenstock
6dd50bb606 StatisticsMedian: Fix bug
Previously, this could return the wrong result when there
was an even number of elements.

There were two `nth_element` calls.  The second call could
change elements in `[center2, end])`, which was where
`center` pointed.  Therefore, `*center` sometimes had the
wrong value after the second `nth_element` call.

Rewrite to use `max_element` instead of the second call to
`nth_element`.  This avoids modifying the vector.
2023-08-24 16:05:09 +02:00
Jesse Rosenstock
dfc8a92abc
test: Use gtest_main only when needed (#1657)
* test: Use gtest_main only when needed

There are two types of tests.  `*_gtest.cc` files use `gtest` and
`gtest_main`.  `*_test.cc` files define their own main.

Only depend on `gtest`/`gtest_main` when needed.  This is similar
to what `CMakeLists.txt` does.

* comment-only: gunit => gtest

* Fix typo
2023-08-24 13:43:50 +01:00
Jesse Rosenstock
9c65aebb26
perf_counters: Initialize once only when needed (#1656)
* perf_counters: Initialize once only when needed

This works around some performance problems running Android under QEMU.
Calling `pfm_initialize` was very slow, and was called during dynamic
initialization (before `main` or when loaded as a shared library).
This happened whenever benchmark was linked, even if no benchmarks
were run.

Instead, call `pfm_initialize` at most once, and only when one of:
1. `PerfCounters::Initialize` is called
2. `PerfCounters::Create` is called with a non-empty counter list
3. `PerfCounters::IsCounterSupported` is called

The return value of the first `pfm_initialize()` is saved and
returned from all subsequent `PerfCounters::Initialize` calls.

* perf_counters: Make success var const

* InitLibPfmOnce: Inline function
2023-08-24 10:04:09 +01:00
Jesse Rosenstock
e73915667c
State: Initialize counters with kAvgIteration in constructor (#1652)
* State: Initialize counters with kAvgIteration in constructor

Previously, `counters` was updated in `PauseTiming()` with
`counters[name] += Counter(measurement, kAvgIteration)`.

The first `counters[name]` call inserts a counter with no flags.

There is no `operator+=` for `Counter`, so the insertion is done
by converting the `Counter` to a `double`, then constructing a
`Counter` to insert from the `double`, which drops the flags.

Pre-insert the `Counter` with the correct flags, then only
update `Counter::value`.

Introduced in 1c64a36 ([perf-counters] Fix pause/resume (#1643)).

* perf_counters_test.cc: Don't divide by iterations

Perf counters are now divided by iterations, so dividing again
in the test is wrong.

* State: Fix shadowed param error

* benchmark.cc: Fix clang-tidy error

---------

Co-authored-by: dominic <510002+dmah42@users.noreply.github.com>
2023-08-21 15:35:42 +01:00
Jesse Rosenstock
e441a8cb11
perf-counters: Make tests pass on Android (#1653)
* perf_counters_gtest: Make test pass on Android

Tested on Pixel 3 and Pixel 6.  Reduce test to the intersection of
what passes on all platforms.

Pixel 6 doesn't support BRANCHES, and only supports two perf
counters.


---------

Co-authored-by: dominic <510002+dmah42@users.noreply.github.com>
2023-08-21 15:04:50 +01:00
dominic
fe1ca332a8
add logo to github pages 2023-08-21 14:31:58 +01:00
Dominic Hamon
9ba2af8d52 add black icon 2023-08-21 14:29:55 +01:00
dominic
87169dd3f5
remove logo from generated docs 2023-08-21 14:25:30 +01:00
dominic
83939d0bd4
remove icon from main README 2023-08-21 14:24:38 +01:00
dominic
05ed7ba2a2
update logo path 2023-08-21 14:21:47 +01:00
Dominic Hamon
72938cc1c5 adding a logo to the docs 2023-08-21 14:21:07 +01:00
Jesse Rosenstock
885e9f71d6
benchmark.cc: Fix benchmarks_with_threads condition (#1651)
Change condition for `benchmarks_with_threads` from `benchmark.threads() > 0` to `> 1`.  `threads()` appears to always be `>= 1`.

Introduced in fbc6efa (Refactoring of PerfCounters infrastructure (#1559))
2023-08-17 15:41:17 +01:00
Jesse Rosenstock
aa59d40f88
sysinfo.cc: Call getloadavg for Android API >= 29 (#1) (#1649)
Support for `getloadavg` was added in API level 29.
2023-08-14 17:02:42 +01:00
Mircea Trofin
1c64a36c5b
[perf-counters] Fix pause/resume (#1643)
* [perf-counters] Fix pause/resume

Using `state.PauseTiming() / state.ResumeTiming()` was broken.

Thanks [@virajbshah] for the the repro testcase.

* ran clang-format over the whole perf_counters_test.cc

* Remove check that perf counters are 0 on `Pause`, since `Pause`/`Resume`
sequences would cause a non-0 counter value

* both upper and lower bound for the with/without resume counters

---------

Co-authored-by: dominic <510002+dmah42@users.noreply.github.com>
2023-08-11 12:46:36 +01:00
Devansh Varshney (देवांश वार्ष्णेय)
cbecc8ffc7
fix: added benchmark_counters_tabular for file (#1645)
* fix: added benchmark_counters_tabular for file

* fix: only checking the counters_tabular flag
2023-08-11 10:59:53 +01:00
Ioanna-Maria Panagou
14961f1cb6
Fix IntelLLVM compiler error (#1644)
* add -fno-finite-math-only for IntelLLVM
2023-08-10 10:33:10 +01:00
देवांश वार्ष्णेय
02a354f3f3
bug: Inconsistent suffixes console reporter 1009 (#1631)
* removed appendHumanReadable as it was not used anywhere

---------

Co-authored-by: dominic <510002+dmah42@users.noreply.github.com>
2023-08-01 08:47:09 +01:00
Andy Christiansen
6e80474e62
Mark internal deps as dev_depenencies so that downstream modules don't require those. (#1640)
Co-authored-by: Andy Christiansen <achristiansen@google.com>
Co-authored-by: dominic <510002+dmah42@users.noreply.github.com>
2023-07-31 17:23:27 +01:00
Saran Tunyasuvunakool
71ad1856fd
Fix -Werror,-Wold-style-cast build failure on Windows. (#1637)
* Fix `-Werror,-Wold-style-cast` build failure on Windows.

* Fix parentheses.

---------

Co-authored-by: dominic <510002+dmah42@users.noreply.github.com>
2023-07-31 15:14:34 +01:00
Nicholas Junge
8f7b8dd9a3
Re-enable windows-latest tests for newer Bazel (#1641)
The Windows toolchain detection fix made it into Bazel 6.3.0, so the CI
should work again with the re-enabled `windows-latest` marker.

Require Bazel 6.3.0 in the Linux container setup in `cibuildwheel`.
2023-07-31 10:51:37 +01:00
James Sharpe
27d64a2351
Update bzlmod support to new rules_python extension API (#1633)
Co-authored-by: dominic <510002+dmah42@users.noreply.github.com>
2023-07-18 08:40:54 +01:00
Nicholas Junge
c5997e0a78
Delete unused requirements file, simplify nanobind build file (#1635)
The dependencies are contained in the `pyproject.toml` since it was added.

Switches to header and source file globbing instead of manually listing
the files. The selects for different platforms are removed, as a tradeoff,
we take a single- to low double-digit hit in wheel sizes (between 5 percent
zipped and 12% installed on MacOS 13.4).
2023-07-17 15:28:35 +01:00
dominic
b1c4a752d1
Add tests for Human Readable functionality (#1632)
* Add tests for Human Readable functionality

also fix an issue where the SI/IEC unit wasn't being correctly passed
through.
2023-07-14 13:56:01 +01:00
dominic
e2556df80f
Downgrade bazel to windows-2019 (#1629)
* Downgrade bazel to windows-2019

Windows 2022 is not well supported by bazel yet:
https://github.com/bazelbuild/bazel/issues/18592

* no windows-latest, only windows-2019 (for bazel)
2023-07-12 14:46:34 +01:00
dependabot[bot]
ba49f1c167
Bump scipy from 1.5.4 to 1.10.0 in /tools (#1630)
Bumps [scipy](https://github.com/scipy/scipy) from 1.5.4 to 1.10.0.
- [Release notes](https://github.com/scipy/scipy/releases)
- [Commits](https://github.com/scipy/scipy/compare/v1.5.4...v1.10.0)

---
updated-dependencies:
- dependency-name: scipy
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-07-11 18:28:32 +03:00
Nicholas Junge
cb39b7150d
Bump nanobind to stable v1.4.0 tag (#1626)
This seems to reduce binding sizes even further, with a wheel size of
175KB on my local machine (macOS 13.4.1).
2023-07-11 09:56:51 +01:00
Dominic Hamon
a092f8222c missing cmake include 2023-07-10 17:58:01 +01:00
Dominic Hamon
c30468bb4b add back package properties for PFM 2023-07-10 17:54:09 +01:00
Pichot
8805bd0c14
pfm: Use a more standard CMake approach for finding libpfm (#1628)
* pfm: Use a more standard CMake approach for finding libpfm

* add myself and sort AUTHORS & CONTRIBUTORS
2023-07-10 17:46:34 +01:00
Nicholas Junge
16c6ad83aa
Add pyproject.toml file for PEP518 compliance (#1625)
The newly created `pyproject.toml` contains all static metadata as well
as the readme and version as dynamic arguments, to be read by setuptools
during the build.

What is left in the `setup.py` for now is the custom Bazel extension
class, since that is not properly supported yet.
2023-07-10 10:43:49 +01:00