Skip to content

Releases: ordo-one/package-benchmark

1.27.4

05 Dec 12:23
51fffb6
Compare
Choose a tag to compare

1.27.4 (2024-12-05)

Bug Fixes

  • patch: Use String(reflecting: error) for printing errors (#290) (51fffb6)

Trigger doc rebuild

17 Oct 03:56
d490969
Compare
Choose a tag to compare
1.27.3

chore: Update .spi.yml (#292)

1.27.2

06 Oct 10:08
f9dcf0b
Compare
Choose a tag to compare

1.27.2 (2024-10-06)

Bug Fixes

  • patch: Log less when --no-progress (again) (#287) (f9dcf0b)

1.27.1

04 Oct 20:25
0036984
Compare
Choose a tag to compare

1.27.1 (2024-10-04)

Bug Fixes

  • patch: Log less when --no-progress in thresholds subcommand (#285) (0036984)

1.27.0

04 Oct 16:13
83e653f
Compare
Choose a tag to compare

What's Changed

Adding support for new thresholds subcommands - used for storing/reading/checking against static saved thresholds - by default output into Thresholds in the current directory, but location can be specified with --path too.

This fundamentally replaces the old options check-absolute and check-absolute-path as well as the explicit export using metricP90AbsoluteThresholds format with new swift package benchmark thresholds commands.

To clarify, the existing thresholds in the benchmark code configuration is really threshold tolerances - unfortunately difficult to rename now, but basically the new thresholds commands operate on static thresholds, while the code defined tolerances continue to be applied to both dynamic and static benchmark checking as outlined in the documentation.

New thresholds support

Update static thresholds (in the Thresholds/ directory)

swift package --allow-writing-to-package-directory benchmark thresholds update
Build of product 'BenchmarkTool' complete! (2.44s)
Build complete!
Building BenchmarkTool in release mode...
Building benchmark targets in release mode for benchmark run...
Building URLBenchmarks
Building StringBenchmarks
Building PredicateBenchmarks
Building JSONBenchmarks
Building InternationalizationBenchmarks
Building FormattingBenchmarks
Building EssentialsBenchmarks
Building DataIOBenchmarks
Building Base64Benchmarks
Building AttributedStringBenchmarks

==================
Running Benchmarks
==================

100% [------------------------------------------------------------] ETA: 00:00:00 | AttributedStringBenchmarks:createLongString-swift
100% [------------------------------------------------------------] ETA: 00:00:00 | AttributedStringBenchmarks:createManyAttributesString-swift
100% [------------------------------------------------------------] ETA: 00:00:00 | AttributedStringBenchmarks:enumerateAttributes-swift
100% [------------------------------------------------------------] ETA: 00:00:00 | AttributedStringBenchmarks:enumerateAttributesSlice-swift
....
100% [------------------------------------------------------------] ETA: 00:00:00 | URLBenchmarks:URLComponents-SetEncodableComponents
100% [------------------------------------------------------------] ETA: 00:00:00 | URLBenchmarks:URLComponents-SetEncodableQueryItems
100% [------------------------------------------------------------] ETA: 00:00:00 | URLBenchmarks:URLComponents-SetQueryItems

==================
Writing Thresholds
==================

Writing to ./Thresholds/PredicateBenchmarks.predicateKeypathComputedPropertyCondition.p90.json
Writing to ./Thresholds/PredicateBenchmarks.predicateTrivialCondition.p90.json
Writing to ./Thresholds/StringBenchmarks.read-utf8.p90.json
...

Reading thresholds

package benchmark thresholds read
...
Build complete!
Building BenchmarkTool in release mode...
Building benchmark targets in release mode for benchmark run...
Building URLBenchmarks
Building StringBenchmarks
Building PredicateBenchmarks
Building JSONBenchmarks
Building InternationalizationBenchmarks
Building FormattingBenchmarks
Building EssentialsBenchmarks
Building DataIOBenchmarks
Building Base64Benchmarks
Building AttributedStringBenchmarks
Reading thresholds from "Thresholds"

utf16-decode
╒══════════════════════════════════════════╤══════════════════════╤══════════════════════╤══════════════════════╕
│ Metric                                   │       Threshold .p90 │            Allowed % │            Allowed Δ │
╞══════════════════════════════════════════╪══════════════════════╪══════════════════════╪══════════════════════╡
│ Time (total CPU)                         │           3208473041 │                  0.0 │                    0 │
├──────────────────────────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┤
│ Time (wall clock)                        │           3211281125 │                  0.0 │                    0 │
╘══════════════════════════════════════════╧══════════════════════╧══════════════════════╧══════════════════════╛

Canada-encodeToJSON
╒══════════════════════════════════════════╤══════════════════════╤══════════════════════╤══════════════════════╕
│ Metric                                   │       Threshold .p90 │            Allowed % │            Allowed Δ │
╞══════════════════════════════════════════╪══════════════════════╪══════════════════════╪══════════════════════╡
│ Time (total CPU)                         │             62029823 │                  0.0 │                    0 │
├──────────────────────────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┤
│ Throughput (# / s)                       │                   17 │                  0.0 │                    0 │
╘══════════════════════════════════════════╧══════════════════════╧══════════════════════╧══════════════════════╛

utf32-decode
╒══════════════════════════════════════════╤══════════════════════╤══════════════════════╤══════════════════════╕
│ Metric                                   │       Threshold .p90 │            Allowed % │            Allowed Δ │
╞══════════════════════════════════════════╪══════════════════════╪══════════════════════╪══════════════════════╡
│ Time (wall clock)                        │           3341120667 │                  0.0 │                    0 │
├──────────────────────────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┤
│ Time (total CPU)                         │           3341006500 │                  0.0 │                    0 │
╘══════════════════════════════════════════╧══════════════════════╧══════════════════════╧══════════════════════╛

allocationsForAutoupdatingCurrentCalendar
╒══════════════════════════════════════════╤══════════════════════╤══════════════════════╤══════════════════════╕
│ Metric                                   │       Threshold .p90 │            Allowed % │            Allowed Δ │
╞══════════════════════════════════════════╪══════════════════════╪══════════════════════╪══════════════════════╡
│ Malloc (total)                           │              4000000 │                  0.0 │                    0 │
├──────────────────────────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┤
│ Time (total CPU)                         │           1360681292 │                  0.0 │                    0 │
├──────────────────────────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┤
│ Memory (resident peak)                   │             12009472 │                  0.0 │                    0 │
├──────────────────────────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┤
│ Throughput (# / s)                       │                    1 │                  0.0 │                    0 │
╘══════════════════════════════════════════╧══════════════════════╧══════════════════════╧══════════════════════╛

getAttributeSubrange-swift
╒══════════════════════════════════════════╤══════════════════════╤══════════════════════╤══════════════════════╕
│ Metric                                   │       Threshold .p90 │            Allowed % │            Allowed Δ │
╞══════════════════════════════════════════╪══════════════════════╪══════════════════════╪══════════════════════╡
│ Throughput (# / s)                       │                 1479 │                  0.0 │                    0 │
├──────────────────────────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┤
│ Time (wall clock)                        │               730111 │                  0.0 │                    0 │
├──────────────────────────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┤
│ Time (total CPU)                         │               728575 │                  0.0 │                    0 │
╘══════════════════════════════════════════╧══════════════════════╧══════════════════════╧══════════════════════╛

write-regularFile
╒══════════════════════════════════════════╤══════════════════════╤══════════════════════╤══════════════════════╕
│ Metric                                   │       Threshold .p90 │            Allowed % │            Allowed Δ │
╞══════════════════════════════════════════╪══════════════════════╪══════════════════════╪══════════════════════╡
│ Time (total CPU)                         │              2656255 │                  0.0 │                    0 │
├──────────────────────────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┤
│ Syscalls (total)                         │                    5 │                  0.0 │                    0 │
├──────────────────────────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┤
│ Malloc (total)                           │                   10 │                  0.0 │                    0 │
├──────────────────────────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┤
│ Throughput (# / s)                       │                  291 │                  0.0 │                    0 │
├──────────────────────────────────────────┼──────────────────────┼──────────────────────┼──────────────────────┤
│ Time (wall clock)                        │              3737599 │                  0.0 │                    0 │
╘══════════════════════════════════════════╧══════════════════════╧══════════════════════╧══════════════════════╛

Check static thresholds

swift package benchmark thresholds check --filter base64-decode-1MB-fromString-noOptions
...
Build of product 'BenchmarkTool' complete! (2.45s)
Build complete!
Building Benchm...
Read more

1.26.0

02 Oct 06:23
aedd5e6
Compare
Choose a tag to compare

1.26.0 (2024-10-02)

Features

It is sometimes useful to tag benchmarks with the parameterisation used instead of varying the benchmark name as previously has been done.

For example, benchmarking func foo(_ n: Int) for various parameterizations of n. This adds support for specifying the tags of a benchmark but makes no functional changes beyond the name/identifier of a benchmark now including a parameter list when one was provided.

The tags are specified as part of the benchmark configuration, e.g.:

    [50, 100, 1000].forEach { parameter in
        Benchmark("Parameterized",
                  configuration: .init(tags: ["myParameter" : parameter.description])) { benchmark in
            for _ in benchmark.scaledIterations {
                blackHole(Int.random(in: 1 ... parameter))
            }
        }
    }

Gives the output:

==================
Running Benchmarks
==================

100% [------------------------------------------------------------] ETA: 00:00:00 | Basic:Parameterized (myParameter: 100)
100% [------------------------------------------------------------] ETA: 00:00:00 | Basic:Parameterized (myParameter: 1000)
100% [------------------------------------------------------------] ETA: 00:00:00 | Basic:Parameterized (myParameter: 50)

=====================================================================================================
Baseline 'Current_run'
=====================================================================================================

Host 'ice.local' with 20 'arm64' processors with 128 GB memory, running:
Darwin Kernel Version 24.0.0: Mon Aug 12 20:51:54 PDT 2024; root:xnu-11215.1.10~2/RELEASE_ARM64_T6000

=====
Basic
=====

Parameterized (myParameter: 100)
╒═══════════════════════════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╕
│ Metric                        │      p0 │     p25 │     p50 │     p75 │     p90 │     p99 │    p100 │ Samples │
╞═══════════════════════════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╡
│ Instructions *                │    1506 │    1567 │    1567 │    1567 │    1567 │    4499 │    9709 │   31531 │
├───────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Malloc (total) *              │       0 │       0 │       0 │       0 │       0 │       0 │       0 │   31531 │
├───────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Memory (resident peak) (M)    │      12 │      12 │      12 │      12 │      12 │      12 │      12 │   31531 │
├───────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Throughput (# / s) (K)        │    1848 │    1601 │    1601 │    1601 │    1502 │    1144 │     110 │   31531 │
├───────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (total CPU) (ns) *       │    2374 │    2459 │    2501 │    2541 │    2667 │    3625 │   62708 │   31531 │
├───────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (wall clock) (ns) *      │     541 │     625 │     625 │     625 │     666 │     875 │    9125 │   31531 │
╘═══════════════════════════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╛

Parameterized (myParameter: 1000)
╒═══════════════════════════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╕
│ Metric                        │      p0 │     p25 │     p50 │     p75 │     p90 │     p99 │    p100 │ Samples │
╞═══════════════════════════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╡
│ Instructions *                │    1558 │    1567 │    1567 │    1567 │    1567 │    4499 │    7851 │   31118 │
├───────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Malloc (total) *              │       0 │       0 │       0 │       0 │       0 │       0 │       0 │   31118 │
├───────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Memory (resident peak) (M)    │      12 │      12 │      12 │      12 │      12 │      12 │      12 │   31118 │
├───────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Throughput (# / s) (K)        │    1848 │    1601 │    1601 │    1601 │    1500 │    1043 │      86 │   31118 │
├───────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (total CPU) (ns) *       │    2374 │    2459 │    2501 │    2585 │    2751 │    4291 │   26667 │   31118 │
├───────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (wall clock) (ns) *      │     541 │     625 │     625 │     625 │     667 │     959 │   11625 │   31118 │
╘═══════════════════════════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╛

Parameterized (myParameter: 50)
╒═══════════════════════════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╤═════════╕
│ Metric                        │      p0 │     p25 │     p50 │     p75 │     p90 │     p99 │    p100 │ Samples │
╞═══════════════════════════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╪═════════╡
│ Instructions *                │    1558 │    1567 │    1567 │    1567 │    1567 │    4499 │   11015 │   31370 │
├───────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Malloc (total) *              │       0 │       0 │       0 │       0 │       0 │       0 │       0 │   31370 │
├───────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Memory (resident peak) (M)    │      12 │      12 │      12 │      12 │      12 │      12 │      12 │   31370 │
├───────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Throughput (# / s) (K)        │    2000 │    1601 │    1601 │    1601 │    1500 │    1093 │      94 │   31370 │
├───────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (total CPU) (ns) *       │    2458 │    2543 │    2583 │    2625 │    2751 │    3625 │   12541 │   31370 │
├───────────────────────────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┼─────────┤
│ Time (wall clock) (ns) *      │     500 │     625 │     625 │     625 │     667 │     916 │   10625 │   31370 │
╘═══════════════════════════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╧═════════╛

Thanks to @CrownedPhoenix for the contribution!

Bug Fixes

1.25.0

13 Aug 13:20
75e8622
Compare
Choose a tag to compare

1.25.0 (2024-08-13)

Features

Possible to pass arbitrary flags to swiftc, e.g:

swift package --disable-sandbox benchmark --target Basic --Xswiftc lto=llvm-full --Xswiftc experimental-hermetic-seal-at-link
  • minor: Support swiftc option passthrough (#262) (75e8622)

1.24.1

13 Aug 10:43
c781564
Compare
Choose a tag to compare

1.24.1 (2024-08-13)

Bug Fixes

  • patch: Fix issues with broken build when visionOS is unknown (#261) (c781564)

1.24.0

13 Aug 10:05
a214635
Compare
Choose a tag to compare

1.24.0 (2024-08-13)

Features

  • minor: Add signposts for explicit starts (#260) (a214635)

1.23.5

13 Jun 05:43
6889229
Compare
Choose a tag to compare

1.23.5 (2024-06-13)