Skip to content

1.27.0

Compare
Choose a tag to compare
@hassila hassila released this 04 Oct 16:13
· 14 commits to main since this release
83e653f

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 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 | Base64Benchmarks:base64-decode-1MB-fromString-noOptions

Reading thresholds from "Thresholds"

Checking ["Base64Benchmarks:base64-decode-1MB-fromString-noOptions"]

===========================================================================================
Deviations worse than threshold for Base64Benchmarks:base64-decode-1MB-fromString-noOptions
===========================================================================================
╒══════════════════════════════════════════╤═════════════════╤═════════════════╤═════════════════╤═════════════════╕
│ Throughput (# / s) (#, Δ)                │   p90 threshold │     Current_run │    Difference Δ │     Threshold Δ │
╞══════════════════════════════════════════╪═════════════════╪═════════════════╪═════════════════╪═════════════════╡
│ p90                                      │             332 │             322 │              10 │               0 │
╘══════════════════════════════════════════╧═════════════════╧═════════════════╧═════════════════╧═════════════════╛

╒══════════════════════════════════════════╤═════════════════╤═════════════════╤═════════════════╤═════════════════╕
│ Throughput (# / s) (#, %)                │   p90 threshold │     Current_run │    Difference % │     Threshold % │
╞══════════════════════════════════════════╪═════════════════╪═════════════════╪═════════════════╪═════════════════╡
│ p90                                      │             332 │             322 │               3 │               0 │
╘══════════════════════════════════════════╧═════════════════╧═════════════════╧═════════════════╧═════════════════╛

============================================================================================
Deviations better than threshold for Base64Benchmarks:base64-decode-1MB-fromString-noOptions
============================================================================================
╒══════════════════════════════════════════╤═════════════════╤═════════════════╤═════════════════╤═════════════════╕
│ Time (total CPU) (μs, Δ)                 │   p90 threshold │     Current_run │    Difference Δ │     Threshold Δ │
╞══════════════════════════════════════════╪═════════════════╪═════════════════╪═════════════════╪═════════════════╡
│ p90                                      │            3217 │            3111 │            -106 │               0 │
╘══════════════════════════════════════════╧═════════════════╧═════════════════╧═════════════════╧═════════════════╛

╒══════════════════════════════════════════╤═════════════════╤═════════════════╤═════════════════╤═════════════════╕
│ Time (total CPU) (μs, %)                 │   p90 threshold │     Current_run │    Difference % │     Threshold % │
╞══════════════════════════════════════════╪═════════════════╪═════════════════╪═════════════════╪═════════════════╡
│ p90                                      │            3217 │            3111 │              -3 │               0 │
╘══════════════════════════════════════════╧═════════════════╧═════════════════╧═════════════════╧═════════════════╛

The baseline 'Current_run' is WORSE than the defined thresholds.

error: benchmarkThresholdRegression
  • chore: Update README.md with CI status badges for builds by @hassila in #281
  • feat: Add explicit support for static thresholds by @hassila in #284

Full Changelog: 1.26.0...1.27.0